/***
 * Excerpted from "Domain-Driven Design Using Naked Objects",
 * published by The Pragmatic Bookshelf.
 * Copyrights apply to this code. It may not be used to create training material, 
 * courses, books, articles, and the like. Contact us if you are in doubt.
 * We make no guarantees that this code is fit for any purpose. 
 * Visit http://www.pragmaticprogrammer.com/titles/dhnako for more book information.
***/
// Copyright (C) 2004 by Alain Bienvenue. All rights reserved.
// Released under the terms of the GNU General Public License version 2 or later.

function SpreadsheetTranslator()
{
  this.currentLine;
  this.rows;
  this.fitNesseTables;

  this.isImplicitTableStart = function(index)
  {
    if (this.rows[index][0].match("^[A-Za-z][0-9A-Za-z]*\\.[A-Za-z][0-9A-Za-z]*"))
    {
      return true;
    }
    var i;
    for (i = index; i < this.rows.length; i++)
    {
      if ((this.rows[i][0] == '!') || this.lineSize(this.rows[i]) == 0)
      {
        return false;
      }
      if (this.lineSize(this.rows[i]) > 1)
      {
        return true;
      }
    }
    return false;
  }

  this.isExplicitTableStart = function(rows, index)
  {
    return (rows[index][0] == "!");
  }

  this.isNotTableLine = function(currentLine, columnsToSkip)
  {
    var row = this.rows[currentLine];
    if (this.lineSize(row) == 0)
    {
      return true;
    }

    var i;
    for (i = 0; i < columnsToSkip; i++)
    {
      if (row[i] != '')
      {
        return true;
      }
    }
    return false;
  }

  this.lineSize = function(row)
  {
    var x;
    for (x = row.length - 1; x >= 0; x--)
    {
      if (row[x] != '') return x + 1;
    }
    return 0;
  }

  this.parseExcelTable = function(excelTable)
  {
    var table = this.removeCarriageReturns(excelTable);
    var lines = table.split("\n");
    this.rows = new Array;
    for (i = 0; i < lines.length; i++)
    {
      this.rows[i] = lines[i].split("\t");
    }
  }


  this.removeCarriageReturns = function(str)
  {
    return str.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
  }

  this.getFitNesseTables = function()
  {
    this.currentLine = 0;
    this.fitNesseTables = new String();
    while (this.currentLine < this.rows.length)
    {
      if (this.isExplicitTableStart(this.rows, this.currentLine))
      {
        this.processTable(1);
      }
      else if (this.isImplicitTableStart(this.currentLine))
      {
        if (this.rows[this.currentLine][0] == '')
        {
          this.processTable(1);
        }
        else
        {
          this.processTable(0);
        }
      }
      else
      {
        this.fitNesseTables += "\n" + this.rows[this.currentLine][0];
      }
      this.currentLine++;
    }
    return this.fitNesseTables.substring(1);
  }


  this.processTable = function(columnsToSkip)
  {
    var tableFirstLine = this.currentLine;
    var tableSize;

    while (this.currentLine < this.rows.length)
    {
      var row = this.rows[this.currentLine];
      if (this.currentLine > tableFirstLine && this.isNotTableLine(this.currentLine, columnsToSkip))
      {
        this.currentLine--;
        return;
      }

      this.fitNesseTables += "\n";
      var lineSize = 0;
      if (this.currentLine == tableFirstLine)
      {
        this.fitNesseTables += "!";
        lineSize = this.lineSize(row);
      }
      else if (this.currentLine == tableFirstLine + 1)
      {
        lineSize = this.lineSize(row);
        tableSize = lineSize;
      }
      else
      {
        lineSize = Math.max(tableSize, this.lineSize(row));
        lineSize = Math.min(lineSize, row.length);
      }

      this.fitNesseTables += "|";
      var j;
      for (j = columnsToSkip; j < lineSize; j++)
      {
        this.fitNesseTables += row[j] + "|";
      }
      this.currentLine++;
    }
  }
}
