<!--

/************************************************************************/
/* transform_messagetable.js                                            */
/*----------------------------------------------------------------------*/
/* Parses the comma separated string containing message information and */
/* builds HTML for the message table.                                   */
/*----------------------------------------------------------------------*/
/* Copyright (c) 2008-2009 Avaya Inc.                                   */
/* 29May08 acurtis               Added previous/next message selection. */
/************************************************************************/

function MessageList( offset, msgsPerPage, mailboxName, folderId, messages_csv )
{
  this.mailboxName = mailboxName;
  this.messagesCsv = messages_csv;
  var msgs = null;
  if( messages_csv )
  {
    // Note: messages_csv is trustworthy so don't need to escape for HTML.
    msgs = messages_csv.split(';');
    var header = msgs[0].split('|');
    this.numMessagesAll = header[0];
    this.numMessagesUnread = header[1];
  }
  else
  {
    msgs = [];
    this.numMessagesAll = 0;
    this.numMessagesUnread = 0;
  }
  this.folderId = folderId;
  this.currentPage = msgsPerPage?(Math.floor( offset / msgsPerPage ) + 1):0;
  this.numMsgsPerPage = msgsPerPage?msgsPerPage:0;
  this.totalPages = msgsPerPage?(Math.ceil( this.numMessagesAll / msgsPerPage )):0;

  // Just to avoid "Page 1 of 0":
  if( this.totalPages == 0 )
  {
    this.totalPages = 1;
  }

  // Number of message records on this page
  this.numMessagesHere = msgs.length - 1 - 1;  //substruct 1, because the last array element is empty due to ';' at the end. Sub another 1 because first record is header not a message.

  // Get base url location for messages
  var baseUrl = messagesBaseUrl + '/' + mailboxName;

  var now = new Date();
  this.messages = new Array();
  for ( var i = 1; i <= this.numMessagesHere; i++ )
  {

    var msgRecord = msgs[i];
    if( !msgRecord )
    {
      break;
    }
    var msgDataArr = msgRecord.split('|');
    if ( msgDataArr.length >= 10 )
    {
      var tmp = UnescapeDelimiters(msgDataArr[10]);
      tmp.replace("\\","/");
      var tmpArr = tmp.split("/");
      var basename = tmpArr[tmpArr.length-1];
      var message = {
        id:UnescapeDelimiters(msgDataArr[0]),
        callerID:UnescapeDelimiters(msgDataArr[1]),
        calledID:UnescapeDelimiters(msgDataArr[2]),
        callingPartyName:UnescapeDelimiters(msgDataArr[3]),
        calledPartyName:UnescapeDelimiters(msgDataArr[4]),
        timeStamp:UnescapeDelimiters(msgDataArr[5]),
        privat:UnescapeDelimiters(msgDataArr[6]),          // Nokia browser doesn't like this being called "private" with an e.
        priority:UnescapeDelimiters(msgDataArr[7]),
        state:parseInt(UnescapeDelimiters(msgDataArr[8])),
        length:UnescapeDelimiters(msgDataArr[9]),
        mediaFilename:UnescapeDelimiters(msgDataArr[10]), // for playback on extension
        mediaUrl:baseUrl + '/'+ basename                  // for playback in browser
      };

      // Add calculated fields
      message.displayTimeStamp = LocaliseTime( message.timeStamp, true /*gBrowser.IsTiny()*/, now );
      message.displayLength = LocaliseLength( message.length );
      message.displayID = message.id.replace('{','').replace('}','');
      message.displayCLI = this.FormatName( message.callerID, message.callingPartyName, gBrowser.IsTiny() );
      message.displayDDI = this.FormatName( message.calledID, message.calledPartyName, gBrowser.IsTiny() );
      message.displayMessageNum = (offset + i) + ' / ' + (this.numMessagesAll);
      message.num = this.messages.length;
      this.messages.push(message);
    }
  }
}

MessageList.prototype.ToHtmlString = function()
{
  var txt = '';

  txt += 'folderId = \'' + TextToHtml(this.folderId) + '\'<br>';
  txt += 'currentPage = \'' + TextToHtml(this.currentPage) + '\'<br>';
  txt += 'totalPages = \'' + TextToHtml(this.totalPages) + '\'<br>';
  txt += 'messages = [<br>';

  for( var n in this.messages )
  {
    var currentMessage = this.messages[n];
    txt += '&nbsp;&nbsp;{<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;ID: \'' + TextToHtml(currentMessage.id) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;num: \'' + TextToHtml(currentMessage.num) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;CallerID: \'' + TextToHtml(currentMessage.callerID) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;CalledID: \'' + TextToHtml(currentMessage.calledID) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;CallingPartyName: \'' + TextToHtml(currentMessage.callingPartyName) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;CalledPartyName: \'' + TextToHtml(currentMessage.calledPartyName) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;TimeStamp: \'' + TextToHtml(currentMessage.timeStamp) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;Private: \'' + TextToHtml(currentMessage.privat) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;Priority: \'' + TextToHtml(currentMessage.priority) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;State: \'' + TextToHtml(currentMessage.state) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;Length: \'' + TextToHtml(currentMessage.length) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;MediaFilename: \'' + TextToHtml(currentMessage.mediaFilename) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;MediaUrl: \'<a href="' + currentMessage.mediaUrl + '">' + TextToHtml(currentMessage.mediaUrl) + '</a>\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;displayTimeStamp: \'' + TextToHtml(currentMessage.displayTimeStamp) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;displayLength: \'' + TextToHtml(currentMessage.displayLength) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;displayID: \'' + TextToHtml(currentMessage.displayID) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;displayCLI: \'' + TextToHtml(currentMessage.displayCLI) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;displayDDI: \'' + TextToHtml(currentMessage.displayDDI) + '\'<br>';
    txt += '&nbsp;&nbsp;&nbsp;&nbsp;displayMessageNum: \'' + TextToHtml(currentMessage.displayMessageNum) + '\'<br>';
    txt += '&nbsp;&nbsp;}<br>';
  }
  txt += ']<br>';
  return txt;
}

MessageList.prototype.FormatName = function( id, name, b_shortForm )
{
  var cli = name;

  if( cli.length )
  {
    if( id.length && !b_shortForm )
    {
      cli += ' (' + id + ')';
    }
  }
  else if( id.length )
  {
    cli = id;
  }
  else
  {
    cli = ' ';
  }

  if( b_shortForm && cli.length > 18 )
  {
    // Take 16 not 18 chars so as to leave room for "..." (in a proportionally spaced typeface)
    cli = cli.substring(0,16) + "...";
  }

  return cli;
}

MessageList.prototype.ToHtml = function( theme, hideToCol )
{
  var html = '';

  html += '<table style="margin:0; padding:0; border-spacing:0; border-collapse:collapse; width:100%;" id="tblMsgs">';
  html +=   '<tr style="color:#333333; background:url(images/' + theme + '/main-middle.gif); font-size:' + (gBrowser.IsTiny()?'9px':'9pt') + ';" >';
  html +=     '<td>';
  html +=       '<input id="allbox" name="allbox" type="checkbox" onclick="Activity(); if(IsClickable(this.id)){MediaStop(); SelectAllMessages();RedrawToolbar();}" title="' + LocaliseString('Select or de-select all messages')+'" />';
  html +=     '</td>';
  html +=     '<td>';
  html +=       '<span id="sort_state" style="color:#333333; text-decoration:underline; cursor:pointer;" onmouseover="return LightUp(this);" onmouseout="return LightDown(this);" onclick="Activity(); if(IsClickable(this.id)){MediaStop(); OnSortButton( \'state\');} return false;">' + LocaliseString('State')+'</span>';
  html +=       '<img style="visibility:hidden;" id="state_sort" src="images/' + theme + '/sort_desc.gif" alt="" />';
  html +=     '</td>';
  html +=     '<td>';
  html +=       '<span id="sort_caller" style="color:#333333; text-decoration:underline; cursor:pointer;" onmouseover="return LightUp(this);" onmouseout="return LightDown(this);" onclick="Activity(); if(IsClickable(this.id)){MediaStop(); OnSortButton( \'from\');} return false;">' + LocaliseString('From')+'</span>';
  html +=       '<img style="visibility:hidden;" id="from_sort" src="images/' + theme + '/sort_desc.gif" alt="" />';
  html +=     '</td>';
  if( !hideToCol && !gBrowser.IsTiny() )
  {
    html +=     '<td>';
    html +=       '<span id="sort_target" style="color:#333333; text-decoration:underline; cursor:pointer;" onmouseover="return LightUp(this);" onmouseout="return LightDown(this);" onclick="Activity(); if(IsClickable(this.id)){MediaStop(); OnSortButton( \'to\');} return false;">' + LocaliseString('To')+'</span>';
    html +=       '<img style="visibility:hidden;" id="to_sort" src="images/' + theme + '/sort_desc.gif" alt="" />';
    html +=     '</td>';
  }
  html +=     '<td>';
  html +=       '<span id="sort_received" style="color:#333333; text-decoration:underline; cursor:pointer;" onmouseover="return LightUp(this);" onmouseout="return LightDown(this);" onclick="Activity(); if(IsClickable(this.id)){MediaStop(); OnSortButton( \'date\');} return false;">' + LocaliseString('Received on')+'</span>';
  html +=       '<img style="visibility:hidden;" id="date_sort" src="images/' + theme + '/sort_desc.gif" alt="" />';
  html +=     '</td>';
  if( !gBrowser.IsTiny() )
  {
    html +=     '<td>';
    html +=       '<span id="sort_length" style="color:#333333; text-decoration:underline; cursor:pointer;" onmouseover="return LightUp(this);" onmouseout="return LightDown(this);" onclick="Activity(); if(IsClickable(this.id)){MediaStop(); OnSortButton( \'length\');} return false;">' + LocaliseString('Length')+'</span>';
    html +=       '<img style="visibility:hidden;" id="length_sort" src="images/' + theme + '/sort_desc.gif" alt="" />';
    html +=     '</td>';
  }
  html +=   '</tr>';


  // Modification request: Don't show so many empty lines on the page:
  if( this.numMsgsPerPage > this.messages.length + 5 )
  {
    this.numMsgsPerPage = this.messages.length + 5;
  }

  var pos = 1;
  for( var n=0; n < this.numMsgsPerPage; ++n )
  {
    if( n < this.messages.length )
    {
      var currentMessage = this.messages[n];
      currentMessage.elemID = 'msg_row_' + pos;

      html += '<tr style="';
      if( currentMessage.state == eMS_new || currentMessage.state == 2 )
      {
        html += 'font-weight:bold; ';
      }

      html += 'height:22px; background:url(\'images/' + theme + '/messages_middle.gif\'); font-size:' + (gBrowser.IsTiny()?'10px':'10pt') + ';" id="' + currentMessage.elemID + '" onclick="Activity(); if(IsClickable(this.id)){CatchEvent(event); SetCurrentMessage('+n+'); ActivateDialog(\'dlg_msg\',true);}return false;" onmouseover="if(IsClickable(this.id)){this.style.background=\'lightsteelblue\';}" onmouseout="if(gCurrentMsg && gCurrentMsg.num=='+n+'){this.style.background=\'lightsteelblue\';}else{this.style.background=\'url(images/' + theme + '/messages_middle.gif)\';}">';
      html += '<td style="border-top:1px solid #c6c6c6;" onclick="Activity(); CatchEvent(event);">';
      html += '<input id="box_' + pos + '" name="' + currentMessage.displayID + '" type="checkbox" onclick="Activity(); CatchEvent(event); RedrawToolbar();" title="' + LocaliseString('Select or de-select message')+'" />';
      html += '</td>';
      html += '<td style="border-top:1px solid #c6c6c6;">';
      html += '<div id="msgState_' + pos + '">';
      switch( currentMessage.state )
      {
        case eMS_new:
        case eMS_unopened:
          html += '<img src="images/' + theme + '/unread.gif" alt="' + LocaliseString('un-opened message')+'" />';
          break;
        case eMS_open:
          html += '<img src="images/' + theme + '/open.gif" alt="' + LocaliseString('previously opened message')+'" />';
          break;
        case eMS_saved:
          html += '<img src="images/' + theme + '/save.gif" alt="' + LocaliseString('saved message')+'" />';
          break;
        case eMS_deleted:
          html += '<img src="images/' + theme + '/trash.gif" alt="' + LocaliseString('message flagged for deletion')+'" />';
          break;
        default:
          html += '<img src="images/' + theme + '/unknown.gif" alt="' + LocaliseString('unknown message state')+'" />';
          break;
      }
      if( currentMessage.privat == 1 )
      {
        html += '<img style="margin-left:-16px;" src="images/' + theme + '/private.gif" alt="' + LocaliseString('private message')+'" />';
      }
      if (currentMessage.priority == 1)
      {
        html += '<img style="margin-left:-16px;" src="images/' + theme + '/priority.gif" alt="' + LocaliseString('priority message')+'" />';
      }
      html += '</div>';
      html += '</td>';
      html += '<td style="border-top:1px solid #c6c6c6;">';
      html += currentMessage.displayCLI;
      html += '</td>';
      if( !hideToCol && !gBrowser.IsTiny() )
      {
        html += '<td style="border-top:1px solid #c6c6c6;">';
        html += currentMessage.displayDDI;
        html += '</td>';
      }
      html += '<td style="border-top:1px solid #c6c6c6;">';
      html += currentMessage.displayTimeStamp;
      html += '</td>';
      if( !gBrowser.IsTiny() )
      {
        html += '<td style="border-top:1px solid #c6c6c6;">';
        html += currentMessage.displayLength;
        html += '</td>';
      }
      html += '</tr>';
      pos++;
    }
    else
    {
      html += '<tr style="';
      html += 'background:url(\'images/' + theme + '/messages_middle.gif\'); font-size:' + (gBrowser.IsTiny()?'10px':'10pt') + '; height:22px;">';
      html += '<td style="border-top:1px solid #c6c6c6;">';
      html += '&nbsp;';
      html += '</td>';
      html += '<td style="border-top:1px solid #c6c6c6;">';
      html += '&nbsp;';
      html += '</td>';
      html += '<td style="border-top:1px solid #c6c6c6;">';
      html += '&nbsp;';
      html += '</td>';
      if( !hideToCol && !gBrowser.IsTiny() )
      {
        html += '<td style="border-top:1px solid #c6c6c6;">';
      html += '&nbsp;';
        html += '</td>';
      }
      html += '<td style="border-top:1px solid #c6c6c6;">';
      html += '&nbsp;';
      html += '</td>';
      if( !gBrowser.IsTiny())
      {
        html += '<td style="border-top:1px solid #c6c6c6;">';
        html += '&nbsp;';
        html += '</td>';
      }
      html += '</tr>';
      pos++;
    }
  }
  html += '</table>';

  html += '<div style="clear:both; height:30px; background:#c6c6c6; border-top:1px solid #656565;">';
  html += '<div style="float:right; margin-right:16px; margin-top:8px;">';
  html += '<select id="pageSelect" name="MultPageNum" ';
  html += 'onchange="MediaStop(); GetMessages(true);return false;" ';
  html += 'title="' + LocaliseString('Navigate to other pages') + '">';
  if( this.totalPages <= 0 )
  {
    html += '<option value="1" selected="selected">';
    html += LocaliseString('Page') + ' 1 ' + LocaliseString('of') + ' 1';
    html += '</option>';
  }
  else
  {
    for( var page=1; page <= this.totalPages; page++ )
    {
      var selstr = '';
      if( page == this.currentPage )
      {
        selstr = ' selected="selected"';
      }
      html += '<option value="' + page + '"' + selstr +'>';
      html += LocaliseString('Page') + ' ' + page + ' ' + LocaliseString('of') + ' ' + this.totalPages;
      html += '</option>';
    }
  }
  html += '</select>';
  html += '</div>';
  html += '</div>';

  return html;
}

//-->

