//
//  Parsing Library
//
//  Author: Giles Mullen
//  Date:   10/13/2000
//
//  Requires: CS10_Lib_Shared
//

var CS_CHK = 1;
var CS_SEP = 2;
var CS_KWD = 3;
var CS_BRK = 4; 

var CS_BRKCH  = "!";
var CS_ESCCH  = "\\";

//
//    CSChunk
//
function CSChunk_toString()
{
  return this.chunk + ": " + this.type;
}
function CSChunk()
{
  this.chunk = "";
  this.type  = 0;
}
CSChunk.prototype.toString = CSChunk_toString;

//
//    Parser Methods
//
function CS_findChunks( templ, seps )
{
  var ret = null;
  var t = templ;
  var arr = new Array();
  do {
    if (t == null)
      break;
    var len   = t.length;
    var i     = 0;
    var j     = -1;
    var type  = 0;
    var last  = 0;
    var c;
    var bSep;
    while (i < len) {
      c = t.charAt( i ); 
      bSep = CS_isCharIn( c, seps ) || c == CS_ESCCH;
      type = bSep ? CS_SEP : CS_CHK;
      if (c == CS_BRKCH)
        type = CS_BRK;
      if (type != last) {
        arr[++j] = new CSChunk();
        arr[j].type = type;
      }
      if (c == CS_ESCCH && i + 1 < len) {
        arr[j].chunk += t.charAt( ++i );
      } else {
        arr[j].chunk += c;
      }
      i++;
      last = type;
    }
    ret = arr;
  } while (false);
  return ret;
}

function CS_findKeywords( chunk, rgxkwd ) {
  var ret = null;
  var res = null;
  var chunkstr = chunk;
  var arr = new Array();
  var j = 0;
  // yes, this is an odd way to process a regex
  // Don't change this unless you test in IE5.0
  while ((res = rgxkwd.exec( chunkstr )) != null && chunkstr.length > 0) {
    arr[j] = new CSChunk();
    arr[j].chunk = res[0];
    arr[j].type  = CS_KWD;
    chunkstr = chunkstr.substr( res[0].length );
    rgxkwd.lastIndex = 0;
    ++j;
  }
  if (arr.length > 0)
    ret = arr;
  return ret;
}

function CS_buildTokenArray( templ, seps, rgxkwd )
{
  var ret = null;
  var arr = new Array();
  do {
    var chunks = CS_findChunks( templ, seps );
    if (chunks == null)
      break;
    var len = chunks.length;
    var toks = null;
    var i = 0, j = 0, k = 0;
    for (i = 0; i < len; i++) {
      if (chunks[i].type == CS_CHK) {
        toks = CS_findKeywords( chunks[i].chunk, rgxkwd );
        if (toks == null)
          continue;
        for (j = 0; j < toks.length; j++) {
          arr[k++] = toks[j];
        }
      } else {
        arr[k++] = chunks[i];
      }
    }
    ret = arr;
  } while (false);
  return ret;
}

