
  //--------------------------------------------------------------------
  //- Class: wharffEvent: The base description for a single Event
  //--------------------------------------------------------------------
  function wharffEvent (group, seq)
  {
    this.group = group;
    this.seq   = seq;

    seq = "00000"+String(seq);
    seq = seq.substring(seq.length-5);

    this.id    = group+"-"+seq;
  }

  wharffEvent.prototype.group       = '';
  wharffEvent.prototype.subgroup    = '';
  wharffEvent.prototype.seq         = 0;
  wharffEvent.prototype.row         = undefined;
  wharffEvent.prototype.col         = undefined;
  wharffEvent.prototype.id          = undefined;
  wharffEvent.prototype.time        = undefined;
  wharffEvent.prototype.room        = undefined;
  wharffEvent.prototype.eventName   = '' ;
  wharffEvent.prototype.description = '' ;
  wharffEvent.prototype.track       = '' ;
  wharffEvent.prototype.presenter   = '' ;
  wharffEvent.prototype.bio         = '' ;
  wharffEvent.prototype.limit       = 0 ;
  wharffEvent.prototype.taken       = 0 ;
  wharffEvent.prototype.style       = '';
  wharffEvent.prototype.script      = '';
  wharffEvent.prototype.selected    = false;
  wharffEvent.prototype.first       = false;
  wharffEvent.prototype.last        = false;
  wharffEvent.prototype.parent      = undefined; // Used by wharffEventCollection

  //--------------------------------------------------------------------

  wharffEvent.prototype.isAvailable = function()
  {
    return this.taken < this.limit;
  };

  //--------------------------------------------------------------------

  wharffEvent.prototype.prepare = function()
  {
    return true;
  };

  //--------------------------------------------------------------------

  wharffEvent.prototype.rawTime = function()
  {
    var v = this.date.split(/[: ]/);
    v[0]  = v[2].search(/pm/i) ? v[0]+12 : v[0];

    return new Date(2008,10,2,v[0], v[1], 0);
  };

  //--------------------------------------------------------------------
  //- Class: wharffEventCollection: A group of wharffEvents
  //--------------------------------------------------------------------

  function wharffEventCollection ()
  {
    this.events = [];
  }

  wharffEventCollection.prototype.events = [];
  wharffEventCollection.prototype.script = '';

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.addEvent = function(anEvent)
  {
   if (this.getEventById(anEvent.id))
    return anEvent;

   anEvent.parent = this;
   this.events.push(anEvent);

   return anEvent;
  };

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.getEventById = function(anId)
  {
    var re = new RegExp('^'+anId+'$','i');

    for (i=0; i<this.events.length; i++)
    {
     if (this.events[i] && re.test(this.events[i].id))
      return this.events[i];
    }

    return false;
  };

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.getEvent = function(group, seq)
  {
    var id = group+"-"+seq;

    return getEventById(id);
  }

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.getEventByName = function(eventName)
  {
    var re = new RegExp('^'+eventName+'$','i');

    for (i=0; i<this.events.length; i++)
    {
     if (this.events[i] && re.test(this.events[i].eventName))
       return this.events[i];
    }

    return false;
  };

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.getGroup = function(group)
  {
    var a  = [];
    var re = new RegExp('^'+group+'$','i');

    for (i=0; i<this.events.length; i++)
    {
     if (this.events[i] && re.test(this.events[i].group))
      a.push(this.events[i]);
    }

    var events = new wharffEventCollection;

    events.events = a.sort(this.bySeq);

    return events;
  }

  wharffEventCollection.prototype.getEventsForGroup =
   wharffEventCollection.prototype.getGroup;

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.getGroupNames = function()
  {
    var names = [];

    for (var i=0; i<this.events.length; i++)
    {
      var gname = this.events[i].group;
      var found = false;

      for (var j=0; !found && j<names.length; j++)
       found = (gname == names[j]);

      if (!found)
       names.push(gname);
    }

    return names;
  };

  wharffEventCollection.prototype.groups =
   wharffEventCollection.prototype.getGroupNames;

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.getSubGroup = function(subGroup)
  {
    var a  = [];
    var re = new RegExp('^'+subGroup+'$','i');

    for (i=0; i<this.events.length; i++)
    {
     if (this.events[i] && re.test(this.events[i].subGroup))
      a.push(this.events[i]);
    }

    var events = new WharffEventCollection;

    events.events = a.sort(this.bySeq);

    return events;
  }

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.getSubGroupNames = function()
  {
    var names = [];

    for (var i=0; i<this.events.length; i++)
    {
      var sname = this.events[i].subgroup;
      var found = false;

      for (var j=0; !found && j<names.length; j++)
       found = (sname == names[j]);

      if (!found)
       names.push(sname);
    }

    return names;
  };

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.getRow = function(rowNumber)
  {
    var a  = [];

    for (i=0; i<this.events.length; i++)
    {
     if (this.events[i]     &&
         this.events[i].row &&
         this.events[i].col &&
         this.events[i].row == rowNumber)
      a.push(this.events[i]);
    }

    var events = new WharffEventCollection;

    events.events = a.sort(this.byCol);

    return events;
  }

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.getSeq = function(seq)
  {
    var a = [];

    for (i=0; i<this.events.length; i++)
    {
     if (this.events[i] && this.events[i].seq == seq)
      a.push(this.events[i]);
    }

    var events = new WharffEventCollection;

    events.events = a.sort(this.byId);

    return events;
  }

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.getTracks = function()
  {
    var t  = [];

    for (i=0; i<this.events.length; i++)
    {
     if (!this.events[i])
      continue;

     for (j=0; j<this.events[i].length; j++)
     {
      var m = false;
      var e = this.events[i][j];

      if (!e)
       continue;

      if (!e.track)
       continue;

      e = e.track.toLowerCase();

      for (k=0; k<t.length; k++)
      {
        if (t[k].toLowerCase() == e)
        {
         m = true;
         break;
        }
      }

      if (!m)
       t.push(this.events[i][j].track);
     }
    }

    var events = new WharffEventCollection;

    events.events = t;

    return events;
  };

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.byId = function(a,b)
  {
   if (a.group < b.group)
    return -1;

   if (a.group > b.group)
    return 1;

   return a.seq - b.seq;
  };

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.bySeq = function(a,b)
  {
   return a.seq - b.seq;
  };

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.byCol = function(a,b)
  {
   return a.col - b.col;
  };

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.sorted = function()
  {
    return this.events.sort(this.byId);
  };

  //--------------------------------------------------------------------

  wharffEventCollection.prototype.sort = function(fname)
  {
   return this.events.sort(fname ? fname : this.byId);
  };

  //--------------------------------------------------------------------

//----------------------------------------------------------------------


