<!--

/************************************************************************/
/* gui_display.js                                                       */
/*----------------------------------------------------------------------*/
/* Code to show, hide, highlight, change-state-of, and populate the GUI */
/* elements.                                                            */
/*----------------------------------------------------------------------*/
/* File created 30Apr08 acurtis                                         */
/* 29May08 acurtis               Added previous/next message selection. */
/*----------------------------------------------------------------------*/
/* Copyright (c) 2008-2009 Avaya Inc.                                   */
/************************************************************************/

// Makes a given element visible or invisible as specified.
function ShowElem( elemId, bShow )
{
  var elem = document.getElementById( elemId );
  if( elem )
  {
    if( bShow )
    {
      elem.style.visibility = "inherit";
    }
    else
    {
      elem.style.visibility = "hidden";
    }
  }
}

// Work around IE6 repainting controls with a delay after parent has moved.
function IE6DragDropWorkaround( dlgId, bDragging )
{
  if( gBrowser.type == eBT_IE && (gBrowser.version*1) < 7 )
  {
    var v = bDragging?'hidden':'inherit';
    // Forward menu and Put In Folder menu on main page may overlap pageSelect.
    if( dlgId == 'dlg_msg' )
    {
      var elem = document.getElementById( "dlg_msg_cbplayer" );
      if( elem )
      {
        elem.style.visibility = v;
      }
      elem = document.getElementById( "dlg_msg_extensionNumber_parent" );
      if( elem )
      {
        if( GetCurrentMediaPlayer() != eMP_extension )
        {
          elem.style.visibility = 'hidden';
        }
        else
        {
          elem.style.visibility = v;
        }
      }
      elem = document.getElementById( "TBTextMsgDialFromExtn" );
      if( elem )
      {
        if( GetCurrentMediaPlayer() != eMP_extension )
        {
          elem.style.visibility = 'hidden';
        }
        else
        {
          elem.style.visibility = v;
        }
      }
    }
  }
}

// Work around for IE6 which draws windows controls on top regardless of their z-index
function IE6MenuWorkaround( menuId, bShowMenu )
{
  if( gBrowser.type == eBT_IE && (gBrowser.version*1) < 7 )
  {
    var v = bShowMenu?'hidden':'inherit';
    // Forward menu and Put In Folder menu on main page may overlap pageSelect.
    if( menuId == 'divForwardMenu' )
    {
      var elem = document.getElementById( "pageSelect" );
      if( elem )
      {
        var bDialogIsActive = ( gActiveDialogs.length > 0 );
        if( bDialogIsActive )
        {
          elem.style.visibility = 'hidden';
        }
        else
        {
          elem.style.visibility = v;
        }
      }
    }
    // Forward menu and Put In Folder menu on msg dialog may overlap media player selector and extn edit box.
    else if( menuId == 'divMsgFoldersMenu' || menuId == 'divMsgForwardMenu' )
    {
      var bNonMsgDialogIsActive = ( gActiveDialogs.length > 0 && gActiveDialogs[0] != 'dlg_msg' );
      var elem = document.getElementById( "dlg_msg_cbplayer" );
      if( elem )
      {
        if( bNonMsgDialogIsActive )
        {
          elem.style.visibility = 'hidden';
        }
        else
        {
          elem.style.visibility = v;
        }
      }
      elem = document.getElementById( "dlg_msg_extensionNumber_parent" );
      if( elem )
      {
        if( bNonMsgDialogIsActive || GetCurrentMediaPlayer() != eMP_extension )
        {
          elem.style.visibility = 'hidden';
        }
        else
        {
          elem.style.visibility = v;
        }
      }
      elem = document.getElementById( "TBTextMsgDialFromExtn" );
      if( elem )
      {
        if( bNonMsgDialogIsActive || GetCurrentMediaPlayer() != eMP_extension )
        {
          elem.style.visibility = 'hidden';
        }
        else
        {
          elem.style.visibility = v;
        }
      }
    }
  }
}

// Hides the specified menu
function HideMenu( menuId )
{
  IE6MenuWorkaround( menuId, false );

  ShowElem( menuId, false );
}

// Shows the specifed menu element.
function ShowMenu( menuId, parentElem )
{
  IE6MenuWorkaround( menuId, true );

  var divf = document.getElementById(menuId);
  if( divf )
  {
    var posY = GetY(parentElem);
    var posX = GetX(parentElem);
    height = parentElem.offsetHeight;

    MoveElem(menuId, posX, posY+height);

    divf.style.visibility='inherit';
  }
}

// Shows/hides the specified menu according to its current visibility.
function ToggleMenu( menuId, parentElem )
{
  CheckSession( function() { ReallyToggleMenu( menuId, parentElem ); } );
}

// Toggles the specified drop-down menu, regardless of whether or not the current session is valid.
function ReallyToggleMenu( menuId, parentElem )
{
  var divf = document.getElementById(menuId);
  if( divf )
  {
    if( ! divf.style.visibility
       || divf.style.visibility == 'hidden' )
    {
      ShowMenu(menuId,parentElem);
    }
    else
    {
      HideMenu(menuId);
    }
  }
}

// Enable/disable the toolbar menus as appropriate
function RedrawToolbar()
{
  EnableTB( 'Delete',       IsEnabled('TBTextDelete'),       IsClickable('TBTextDelete') );
  EnableTB( 'Move',         IsEnabled('TBTextMove'),         IsClickable('TBTextMove') );
  EnableTB( 'Save',         IsEnabled('TBTextSave'),         IsClickable('TBTextSave') );
  EnableTB( 'MarkAsRead',   IsEnabled('TBTextMarkAsRead'),   IsClickable('TBTextMarkAsRead') );
  EnableTB( 'MarkAsUnread', IsEnabled('TBTextMarkAsUnread'), IsClickable('TBTextMarkAsUnread') );
  EnableTB( 'Forward',      IsEnabled('TBTextForward'),      IsClickable('TBTextForward') );
}

// Enable the menus if there are messages selected
function RedrawMsgToolbar()
{
  EnableTB( 'MsgDelete',       IsEnabled('TBTextMsgDelete'),       IsClickable('TBTextMsgDelete') );
  EnableTB( 'MsgMove',         IsEnabled('TBTextMsgMove'),         IsClickable('TBTextMsgMove') );
  EnableTB( 'MsgSave',         IsEnabled('TBTextMsgSave'),         IsClickable('TBTextMsgSave') );
  EnableTB( 'MsgMarkAsRead',   IsEnabled('TBTextMsgMarkAsRead'),   IsClickable('TBTextMsgMarkAsRead') );
  EnableTB( 'MsgMarkAsUnread', IsEnabled('TBTextMsgMarkAsUnread'), IsClickable('TBTextMsgMarkAsUnread') );
  EnableTB( 'MsgForward',      IsEnabled('TBTextMsgForward'),      IsClickable('TBTextMsgForward') );
  EnableTB( 'MsgDialFromExtn', IsEnabled('TBTextMsgDialFromExtn'), IsClickable('TBTextMsgDialFromExtn') );

  var elem = document.getElementById( 'dlg_msg_cbplayer' );
  if( elem )
  {
    var bDisabled = !IsClickable('dlg_msg_cbplayer');
    elem.disabled = bDisabled;

    // Workaround for IE6 which draws controls on top of everything else
    if( gBrowser.type == eBT_IE && (gBrowser.version*1) < 7 )
    {
      if( bDisabled )
      {
        elem.style.visibility = 'hidden';
      }
      else
      {
        elem.style.visibility = 'inherit';
      }
    }
  }

  elem = document.getElementById( 'dlg_msg_extensionNumber_parent' );
  if( elem )
  {
    var bDisabled = !IsClickable('dlg_msg_extensionNumber_parent');
    elem.disabled = bDisabled;

    // Workaround for IE6 which draws controls on top of everything else
    if( gBrowser.type == eBT_IE && (gBrowser.version*1) < 7 )
    {
      if( bDisabled || GetCurrentMediaPlayer() != eMP_extension )
      {
        elem.style.visibility = 'hidden';
      }
      else
      {
        elem.style.visibility = 'inherit';
      }
    }
  }
  elem = document.getElementById( 'TBTextMsgDialFromExtn' );
  if( elem )
  {
    var bDisabled = !IsClickable('TBTextMsgDialFromExtn');
    elem.disabled = bDisabled;

    // Workaround for IE6 which draws controls on top of everything else
    if( gBrowser.type == eBT_IE && (gBrowser.version*1) < 7 )
    {
      if( bDisabled || GetCurrentMediaPlayer() != eMP_extension )
      {
        elem.style.visibility = 'hidden';
      }
      else
      {
        elem.style.visibility = 'inherit';
      }
    }
  }
}

// Does an ajax check that user session is still active (with ajax_check_session), then calls ReallyActivateDialog()
function ActivateDialog( dlgId, bShow, msgIds )
{
  if( !gSessionFailed )
  {
    CheckSession( function() { ReallyActivateDialog(dlgId, bShow, msgIds); } );
  }
  else if( dlgId == 'none' || bShow == false )
  {
    ReallyActivateDialog(dlgId, bShow, msgIds);
  }
}

// Activates a dialog box, without first checking to see if session is active. See also ActivateDialog().
function ReallyActivateDialog( dlgId, bShow, msgIds )
{
  // If dialog is already the foremost active dialog, don't do anything.
  // (E.g. This fn can be called when dragging a dialog, and we don't want media playback to restart.)
  var bAlreadyActive = (gActiveDialogs.length > 0 && gActiveDialogs[0] == dlgId );
  if( bShow && bAlreadyActive )
  {
    return;
  }

  if( bShow )
  {
    // Clear status message
    var divMsg = dlgId + '_msg';
    var elemMsg = document.getElementById( divMsg );
    if( elemMsg )
    {
      elemMsg.innerHTML = "&nbsp;";
    }
  }

  // Hide for now, show later in this fn if needed.
  //ShowElem( 'btn_ForwardDist', false );

  if( dlgId == "none" )
  {
    MediaStop();
    RememberExtensionNumber();

    ShowElem( 'dlg_msg', false );
    ShowElem( 'dlg_change_settings', false );
    ShowElem( 'dlg_ForwardExtn', false );
    ShowElem( 'dlg_ForwardHunt', false );

    // Clear active dialogs stack
    gActiveDialogs = [];
  }
  else
  {
    var elem_active = document.getElementById(dlgId);
    if( bShow )
    {
      if( elem_active )
      {
        CentreElem(dlgId);

        if( dlgId == "dlg_change_settings" )
        {
          PopulateSettingsForm();
        }
        else if( dlgId == "dlg_ForwardExtn" )
        {
          if ( gExtnList && gExtnList.length > 0 )
          {
            PopulateForwardingList( gExtnList, eMBT_extension, msgIds );
            
            // If browser has populated the Find editbox, re-run the find now.
            var elem = document.getElementById('dlg_ForwardExtn_find');
            if( elem && elem.value != "" )
            {
              OnFind('ForwardExtn', elem.value);
            }
          }
          else
          {
            ShowElem( 'btn_ForwardExtn', false );
            ShowAlert( LocaliseString( "No extensions were found on the system." ) );
          }
        }
        else if( dlgId == "dlg_ForwardHunt" )
        {
          if ( gHGList && gHGList.length > 0 )
          {
            PopulateForwardingList( gHGList, eMBT_huntGroup, msgIds );
            
            // If browser has populated the Find editbox, re-run the find now.
            var elem = document.getElementById('dlg_ForwardHunt_find');
            if( elem && elem.value != "" )
            {
              OnFind('ForwardHunt', elem.value);
            }            
          }
          else
          {
            ShowElem( 'btn_ForwardHunt', false );
            ShowAlert( LocaliseString( "No hunt groups were found on the system." ) );
          }
        }
        else if( dlgId == "dlg_msg" )
        {
          // Disable periodic message list refresh while media is playing
          gPageRefreshSemaphore++;
          PopulateMessageDialog();
          
          // Show/hide Ringback button
          var player = GetCurrentMediaPlayer();
          ShowElem( 'TBTextMsgDialFromExtn', ( player == eMP_extension ) );
          gEnableDialFromExtn = true;
        }

        elem_active.style.visibility='inherit';
      }

      // Add to active dialogs stack
      gActiveDialogs.unshift( dlgId );
    }
    else
    {
      ShowElem( dlgId, false );
      if( dlgId == "dlg_msg" )
      {
        MediaStop();
        RememberExtensionNumber();

        // Re-enable periodic message list refresh
        if( gPageRefreshSemaphore>0 )
        {
          --gPageRefreshSemaphore;
        }        
      }
      else if( dlgId == 'dlg_textbox' || dlgId == 'dlg_alert' )
      {
        if( elem_active )
        {
          // Bug in firefox 2.0.0.13 means this element with overflow set corrupts screen, so set it way off screen even when not visible.
          if( gBrowser.type != eBT_IE )
          {
            elem_active.style.top = '-600px;';
          }
        }
      }

      // Remove from active dialogs stack
      for( var i=0; i<gActiveDialogs.length; ++i )
      {
        if( gActiveDialogs[i] == dlgId )
        {
          gActiveDialogs.splice(i,1);
          break;
        }
      }
    }
  }

  // Fix up z ordering and opacity
  FixupDialogZ();

  // Can't have a current message if no dialogs are open.
  if( gActiveDialogs.length == 0 )
  {
    gCurrentMsg = null;
  }

  RedrawAll();
}

// Rebuild forwarding list based on last call to PopulateForwardingList() but with a different ordering.
function RePopulateForwardingList( orderBy )
{
  if( gForwardingListData.length == 0 )
  {
    return;
  }
  if( orderBy.length > 0 )
  {
    if( gCurrentFwdOrderBy == orderBy )
    {
      if( gCurrentFwdSortDir == 'DESC' )
        gCurrentFwdSortDir = 'ASC';
      else
        gCurrentFwdSortDir = 'DESC';
    }
    else
    {
      gCurrentFwdOrderBy = orderBy;
      gCurrentFwdSortDir = 'DESC';
    }
  }
  PopulateForwardingList( gForwardingListData, gForwardingListMailboxType, gForwardingListMsgIds )
}
// Arg 'mailboxType' is either eMBT_distributionList, eMBT_huntGroup, eMBT_extension
// Parses 'data' and dynamically builds a table of names+numbers and puts it in either list_ForwardExtn, list_ForwardHunt, list_ForwardDist according to 'mailboxType'.
//Example of 'data':
//data = '{2293853B-4256-4678-A3B3-33CB37BB4450}|201|Extn201;'
//       '{D5DAD569-AEE9-49C3-89E2-D2D9B2D7EE2A}|202|Extn202;' ;
function PopulateForwardingList( data, mailboxType, msgIds )
{
  if( data.length == 0 )
  {
    return;
  }
  gForwardingListData = data;
  gForwardingListMailboxType = mailboxType;
  gForwardingListMsgIds = msgIds;
  var tbl = '';
  var btn = '';
  var list = '';
  var prepend = '';
  var cball = '';
  var listName = '';
  var theme = GetCurrentTheme();

  switch( mailboxType )
  {
    case eMBT_extension:
      listName = 'ForwardExtn';
      break;

    case eMBT_huntGroup:
      listName = 'ForwardHunt';
      break;
  }

  if( listName != '' )
  {
    tbl = 'tbl_' + listName;
    btn = 'btn_' + listName;
    list = 'list_' + listName;
    prepend = 'cb_' + listName;
    cball = 'cball_' + listName;

    itemHTML  = '<input id="fwd_msgIds" value="'+msgIds+'" type="hidden" />';
    itemHTML += '<div style="border: #656565 1px solid; font-size: 9pt; width:';
    if (gBrowser.width<640)
    {
      itemHTML += ((gBrowser.width<400)?(gBrowser.width-38):(362));
    }
    else
    {
      itemHTML += '362';
    }
    itemHTML += 'px;">';
    itemHTML += '  <div style="background-color:#dcdcdc; font-size:9pt; font-weight:bold;height:18px;"> ';
    itemHTML += '    <span id="sort_fwd_number" style="color:#333333; cursor:pointer; position:absolute; left:35px;" onmouseover="return LightUp(this);" onmouseout="return LightDown(this);" onclick="Activity(); if(IsClickable(this.id)){RePopulateForwardingList(\'number\');} return false;">';
    itemHTML += LocaliseString("Number");
    if( gCurrentFwdOrderBy == 'number' )
    {
      itemHTML += '      <img src="images/' + theme + '/' + (gCurrentFwdSortDir == 'DESC'?'sort_desc.gif':'sort_asc.gif') + '" />';
    }
    else
    {
      itemHTML += '      <img src="images/blank.gif" style="height:16px; width:16px;" alt="" />';
    }
    itemHTML += '    </span>';
    itemHTML += '    <span id="sort_fwd_name" style="color:#333333; cursor:pointer; position:absolute; left:135px;" onmouseover="return LightUp(this);" onmouseout="return LightDown(this);" onclick="Activity(); if(IsClickable(this.id)){RePopulateForwardingList(\'name\');} return false;">';
    itemHTML += LocaliseString("Name");
    if( gCurrentFwdOrderBy == 'name' )
    {
      itemHTML += '      <img src="images/' + theme + '/' + (gCurrentFwdSortDir == 'DESC'?'sort_desc.gif':'sort_asc.gif') + '" />';
    }
    else
    {
      itemHTML += '      <img src="images/blank.gif" style="height:16px; width:16px;" alt="" />';
    }
    itemHTML +=  '   </span>';
    itemHTML += '  </div>';


    itemHTML += '  <div>';
    itemHTML += '      <div style="height: 150px; overflow:auto;">';
    itemHTML += '        <table cellpadding="0" cellspacing="0" id="' + tbl + '" style="width:';
    if (gBrowser.width<640)
    {
      itemHTML += ((gBrowser.width<400)?(gBrowser.width-73):(327));
    }
    else
    {
      itemHTML += '327';
    }
    itemHTML += 'px; font-size: 9pt; border-spacing:0px;">';


    // Strip trailing ';' if any
    if( data.charAt( data.length-1 ) == ';' )
    {
      data = data.substr(0,data.length-1);
    }

    var items = data.split(";");
    var dirn = (gCurrentFwdSortDir=='ASC')?1:-1;
    switch( gCurrentFwdOrderBy )
    {
      case 'number':
        items.sort( function(str1,str2) {
          return str1.substr(str1.indexOf("|")+1 ).localeCompare(str2.substr(str2.indexOf("|")+1 ))*dirn;
        } );
        break;
      case 'name':
        items.sort( function(str1,str2) {         
          return str1.substr(str1.indexOf("|",str1.indexOf("|")+1)+1 ).localeCompare(str2.substr(str2.indexOf("|",str2.indexOf("|")+1)+1 ))*dirn;
        } );
      break;
    }

    var itemCount = items.length;
    var actualItemCount = 0;
    var index = 0;
    for( var i = 0; i < itemCount;  i++ )
    {
      var item = items[i];
      var arr = item.split("|");
      var id = UnescapeDelimiters(arr[0]);
      var number = UnescapeDelimiters(arr[1]);
      var name = UnescapeDelimiters(arr[2]);
      var classname = "ForwardingName";

      // Guid is surrounded by curly brackets {}, we need to trim them
      id = id.substr(1, id.length-2);

      if ( number.length > 0 && name.length > 0 && gMailboxId != id)
      {
        ++actualItemCount;

        var id_name = EscapeDelimiters(id) + '|' + EscapeDelimiters(name);

        itemHTML += '          <tr style="border-bottom:1px solid #999; font-size:9pt;">';
        itemHTML += '            <td class="ForwardingCheckbox" style="width:20px; padding:0;">';
        itemHTML += '              <input id="' + prepend + index + '" name="' + prepend + index + '" value="' + TextToHtml(id_name) + '" type="checkbox" />';
        itemHTML += '            </td>';
        itemHTML += '            <td class="ForwardingNumber" style="width:100px; padding:0;" align="left">' + TextToHtml(number) + '</td>';
        itemHTML += '            <td class="' + classname + '" style="padding:0;" align="left">' + TextToHtml(name) + '</td>';
        itemHTML += '          </tr>';
        index++;
      }
    }
    gNumExtnsInForwardList[listName] = actualItemCount;

    itemHTML += '        </table>';
    itemHTML += '      </div>';
    itemHTML += '  </div>';
    itemHTML += '</div>';
    document.getElementById(list).innerHTML = itemHTML;

    ShowElem( btn, true );
  }
}

function PopulateMessageDialog()
{
  MediaStop();

  if( gCurrentMsg != null )
  {
    if(document.getElementById('dlg_msg_callerid'))  document.getElementById('dlg_msg_callerid').innerHTML  = TextToHtml( gCurrentMsg.displayCLI );
    if(document.getElementById('dlg_msg_calledid'))  document.getElementById('dlg_msg_calledid').innerHTML  = TextToHtml( gCurrentMsg.displayDDI );
    if(document.getElementById('dlg_msg_timestamp')) document.getElementById('dlg_msg_timestamp').innerHTML = TextToHtml( gCurrentMsg.displayTimeStamp );
    if(document.getElementById('dlg_msg_length'))    document.getElementById('dlg_msg_length').innerHTML    = TextToHtml( gCurrentMsg.displayLength );
    if( null != gCurrentMsg.displayMessageNum )
    {
      if(document.getElementById('dlg_msg_msgnum'))    document.getElementById('dlg_msg_msgnum').innerHTML    = TextToHtml( gCurrentMsg.displayMessageNum );
      if(document.getElementById('dlg_msg_msgnum'))    document.getElementById('dlg_msg_msgnum').style.visibility = 'inherit';
      if(document.getElementById('dlg_msg_msgnum_label'))    document.getElementById('dlg_msg_msgnum_label').style.visibility = 'inherit';
    }
    else
    {
      if(document.getElementById('dlg_msg_msgnum'))    document.getElementById('dlg_msg_msgnum').style.visibility = 'hidden';
      if(document.getElementById('dlg_msg_msgnum_label'))    document.getElementById('dlg_msg_msgnum_label').style.visibility = 'hidden';
    }

    if( null != gCurrentMsg.num && !(0 == gCurrentMsg.num && 1 == gMessageList.currentPage) )
    {
      if(document.getElementById('dlg_msg_first_label'))    document.getElementById('dlg_msg_first_label').style.visibility = 'inherit';
      if(document.getElementById('TBIconMsgFirst'))    document.getElementById('TBIconMsgFirst').style.visibility = 'inherit';
      if(document.getElementById('dlg_msg_prev_label'))    document.getElementById('dlg_msg_prev_label').style.visibility = 'inherit';
      if(document.getElementById('TBIconMsgPrev'))    document.getElementById('TBIconMsgPrev').style.visibility = 'inherit';
    }
    else
    {
      if(document.getElementById('dlg_msg_first_label'))    document.getElementById('dlg_msg_first_label').style.visibility = 'hidden';
      if(document.getElementById('TBIconMsgFirst'))    document.getElementById('TBIconMsgFirst').style.visibility = 'hidden';
      if(document.getElementById('dlg_msg_prev_label'))    document.getElementById('dlg_msg_prev_label').style.visibility = 'hidden';
      if(document.getElementById('TBIconMsgPrev'))    document.getElementById('TBIconMsgPrev').style.visibility = 'hidden';
    }
    if( null != gCurrentMsg.num && gMessageList.numMessagesAll-1 > gCurrentMsg.num + (gMessageList.currentPage-1) * gMessageList.numMsgsPerPage )
    {
      if(document.getElementById('dlg_msg_next_label'))    document.getElementById('dlg_msg_next_label').style.visibility = 'inherit';
      if(document.getElementById('TBIconMsgNext'))    document.getElementById('TBIconMsgNext').style.visibility = 'inherit';
      if(document.getElementById('dlg_msg_last_label'))    document.getElementById('dlg_msg_last_label').style.visibility = 'inherit';
      if(document.getElementById('TBIconMsgLast'))    document.getElementById('TBIconMsgLast').style.visibility = 'inherit';
    }
    else
    {
      if(document.getElementById('dlg_msg_next_label'))    document.getElementById('dlg_msg_next_label').style.visibility = 'hidden';
      if(document.getElementById('TBIconMsgNext'))    document.getElementById('TBIconMsgNext').style.visibility = 'hidden';
      if(document.getElementById('dlg_msg_last_label'))    document.getElementById('dlg_msg_last_label').style.visibility = 'hidden';
      if(document.getElementById('TBIconMsgLast'))    document.getElementById('TBIconMsgLast').style.visibility = 'hidden';
    }



    // Set open/closed envelope icon.
    UpdateMessageDlg();

    MediaStart( false, true );
  }
  else
  {
    ReallyActivateDialog( 'dlg_msg', false );
  }
  RedrawMsgToolbar();
}

function PopulateSettingsForm()
{
  // Clear all change-password fields
  document.getElementById('oldpwd').value  = "";
  document.getElementById('newpwd1').value = "";
  document.getElementById('newpwd2').value = "";

  // Clear change-password output message
  document.getElementById('dlg_change_settings_msg').innerHTML = "";

  // Set messages-per-page selector
  var elem = document.getElementById( 'nummsgsperpage' );
  if( elem )
  {
    var num = GetNumMsgsPerPage()*1;
    var selectedIndex = 0;
    for( var i in elem.options )
    {
      if( (elem.options[i]) && (elem.options[i].value) && (elem.options[i].value*1 > num) )
      {
        break;
      }
      selectedIndex = i;
    }
    elem.selectedIndex = selectedIndex;
  }

  // Set hide-to-column checkbox
  var elem = document.getElementById( 'hidetocol' );
  if( elem )
  {
    elem.checked = GetHideToColSetting();
  }
}

// Selects all items in tbl_listName to the state of cball_listName checkbox.
function SelectAllForwardItems( listName )
{
  var cball = document.getElementById('cball_'+listName);
  var tbl = document.getElementById('tbl_'+listName);
  if( cball && tbl )
  {
    var state = cball.checked;
    var nRows = tbl.rows.length;
    for( var i = 0; i<nRows; ++i )
    {
      var cb = document.getElementById('cb_' + listName + i);
      if( cb )
      {
        cb.checked = state;
      }
    }
  }
}

// Deselects all those messages that are marked as private.
function DeselectPrivateMessages()
{
  var elem = document.getElementById('tblMsgs');
  if( elem )
  {
    var totalCount = elem.rows.length;
    for( i = 1; i < totalCount; i++ )
    {
      var ctrlId = 'box_' + i;
      var cb = document.getElementById(ctrlId);
      if( cb )
      {
        if( gMessageList.messages[index-1]['Private'] == 1 )
        {
          cb.checked = false;
        }
      }
    }
  }
}

// Highlights the folder tab item with the given id.
// Then reload messages.
function SelectFolderItem( id )
{
  gFolderList.currentFolderId = id;

  // Render folders list
  var elem = document.getElementById( 'tabs' );
  if( elem )
  {
    elem.innerHTML = gFolderList.ToHtml( GetCurrentTheme() );
  }

  // Show an empty messages list while we wait for the real one to load
  var ajaxDisplay = document.getElementById('divMsgs');
  if( ajaxDisplay )
  {
    var messageList = new MessageList(0,GetNumMsgsPerPage());
    ajaxDisplay.innerHTML = messageList.ToHtml( GetCurrentTheme(), GetHideToColSetting() );
  }

  GetMessages( true );
}

// Updates the large read/unread icon to reflect the current message state
function UpdateMessageDlg()
{
  var icon_elem = document.getElementById('dlg_msg_icon');
  if( icon_elem )
  {
    var state = eMS_unknown;
    if( gCurrentMsg )
    {
      state = gCurrentMsg.state;
    }

    var currentTheme = GetCurrentTheme();
    if( state == eMS_new )
    {
      icon_elem.src = "images/"+currentTheme+"/closed_lg.gif";
      icon_elem.alt = LocaliseString( 'Message has not yet been heard' );
    }
    else if( state == eMS_saved )
    {
      icon_elem.src = "images/"+currentTheme+"/disc32.gif";
      icon_elem.alt = LocaliseString( 'Message has been saved' );
    }
    else if( state == eMS_deleted )
    {
      icon_elem.src = "images/"+currentTheme+"/trash32.gif";
      icon_elem.alt = LocaliseString( 'Message has been deleted' );
    }
    else
    {
      icon_elem.src = "images/"+currentTheme+"/open_lg.gif";
      icon_elem.alt = LocaliseString( 'Message has been heard' );
    }

    var priority_elem = document.getElementById('dlg_msg_priority_overlay');
    if( priority_elem )
    {
      priority_elem.style.visibility = (gCurrentMsg && gCurrentMsg.priority == 1)?'inherit':'hidden';
    }
    var private_elem = document.getElementById('dlg_msg_private_overlay');
    if( private_elem )
    {
      private_elem.style.visibility = (gCurrentMsg && gCurrentMsg.privat == 1)?'inherit':'hidden';
    }
  }
}

// Moves an already active dialog to the top of the stack
function RaiseDialog( dlgId )
{
  for( var i=0; i<gActiveDialogs.length; ++i )
  {
    if( gActiveDialogs[i] == dlgId )
    {
      gActiveDialogs.splice(i,1);
      gActiveDialogs.unshift( dlgId );
      FixupDialogZ();
      return;
    }
  }
}

// Consolidates the z indexes of all the dialog boxes to keep them well defined.
// Also shades out all but the top-most dialog.
function FixupDialogZ()
{
  var z = 1000 + 1000 * gActiveDialogs.length;
  for( var i=0; i<gActiveDialogs.length; ++i )
  {
    var elem = document.getElementById( gActiveDialogs[i] );
    if( elem )
    {
      if( i == 0 )
      {
        elem.style.opacity = 1.0;
      }
      else
      {
        elem.style.opacity = 0.3;
      }
      elem.style.zIndex = z;
    }
    z -= 1000;
  }

  var elem = document.getElementById( 'main_form' );
  if( elem )
  {
    if( i == 0 )
    {
      elem.style.opacity = 1.0;
    }
    else
    {
      elem.style.opacity = 0.3;
    }
  }

  // Workaround Windows Media Player not honouring its z-index.  (non-IE browsers)
  // Hide it unless message dialog is on top.
  if( gBrowser.type != eBT_IE )
  {
    elem = document.getElementById( 'dlg_msg_wmp' );
    if( elem )
    {
      if( gActiveDialogs.length > 0 && gActiveDialogs[0] == 'dlg_msg' )
      {
        elem.style.visibility = 'inherit';
      }
      else
      {
        elem.style.visibility = 'hidden';
      }
    }
  }
}

// Redraw all GUI elements
function RedrawAll()
{
  HideMenu('divForwardMenu');
  HideMenu('divMsgFoldersMenu');
  HideMenu('divMsgForwardMenu');
  RedrawButtons();
  RedrawFolderList();
  RedrawMessageList();
  RedrawToolbar();
  RedrawMsgToolbar();
  RedrawForwardLists();
}

// Enable/Disable top buttons
function RedrawButtons()
{
  var bDialogIsActive = ( gActiveDialogs.length > 0 );
  var cursorType = bDialogIsActive?("default"):("pointer");

  var elem = document.getElementById( "sign_out" );
  if( elem )
  {
    elem.disabled = bDialogIsActive;
    elem.style.cursor = cursorType;
    elem.prevcursor = cursorType;
  }
  var elem = document.getElementById( "change_settings" );
  if( elem )
  {
    elem.disabled = bDialogIsActive;
    elem.style.cursor = cursorType;
    elem.prevcursor = cursorType;
  }
}


// Enable/Disable forward lists
function RedrawForwardLists()
{
  RedrawForwardList('ForwardExtn');
  RedrawForwardList('ForwardHunt');
//  RedrawForwardList('ForwardDist');
}

function RedrawForwardList( listName )
{
  var dlgId = 'dlg_' + listName;
  var bAnotherDialogIsActive = (gActiveDialogs.length > 0 && gActiveDialogs[0] != dlgId );
  var bFwdDialogIsActive = (gActiveDialogs.length > 0 && gActiveDialogs[0].substr(0,11) == 'dlg_Forward');
  var cursorType = bFwdDialogIsActive?("pointer"):("default");

  var n = gNumExtnsInForwardList[listName];
  for( var i=0; i<n; ++i )
  {
    var elem_id = "cb_" + listName + i;
    var elem = document.getElementById( elem_id );
    if( elem )
    {
      elem.disabled = bAnotherDialogIsActive;
    }
  }
  var elem_id = "btn_" + listName;
  var elem = document.getElementById( elem_id );
  if( elem )
  {
    elem.disabled = bAnotherDialogIsActive;
  }
  elem_id = "cball_" + listName;
  elem = document.getElementById( elem_id );
  if( elem )
  {
    elem.disabled = bAnotherDialogIsActive;
  }

  elem = document.getElementById( 'sort_fwd_number' );
  if( elem )
  {
    elem.style.cursor = cursorType;
    elem.prevcursor = cursorType;
  }
  elem = document.getElementById( 'sort_fwd_name' );
  if( elem )
  {
    elem.style.cursor = cursorType;
    elem.prevcursor = cursorType;
  }
}

// Enable/Disable folder list
function RedrawFolderList()
{
  var bDialogIsActive = ( gActiveDialogs.length > 0 );
  var cursorType = bDialogIsActive?("default"):("pointer");

  for (i = 0; i < gNumFoldersInList; i++ )
  {
    var elem_id = "fit_" + (i);
    var elem = document.getElementById( elem_id );
    if( elem )
    {
      elem.style.cursor = cursorType;
      elem.prevcursor = cursorType;
    }
  }
}

// Enable/Disable message list checkboxes if any popups are active
function RedrawMessageList()
{
  var bDialogIsActive = ( gActiveDialogs.length > 0 );
  var cursorType = bDialogIsActive?("default"):("pointer");

  if ( document.getElementById('tblMsgs') != null )
  {
    var totalCount = document.getElementById('tblMsgs').rows.length;
    for (index = 1; index < totalCount; index++ )
    {
      var elem_id = "box_" + index;
      var elem = document.getElementById( elem_id );
      if( elem )
      {
        elem.disabled = bDialogIsActive;
      }
      elem_id = "msg_row_" + index;
      elem = document.getElementById( elem_id );
      if( elem )
      {
        elem.style.cursor = cursorType;
        elem.prevcursor = cursorType;
      }
    }
  }
  var elem = document.getElementById( 'sort_state' );
  if( elem )
  {
    elem.style.cursor = cursorType;
    elem.prevcursor = cursorType;
  }
  elem = document.getElementById( 'sort_caller' );
  if( elem )
  {
    elem.style.cursor = cursorType;
    elem.prevcursor = cursorType;
  }
  elem = document.getElementById( 'sort_received' );
  if( elem )
  {
    elem.style.cursor = cursorType;
    elem.prevcursor = cursorType;
  }
  elem = document.getElementById( 'sort_target' );
  if( elem )
  {
    elem.style.cursor = cursorType;
    elem.prevcursor = cursorType;
  }
  elem = document.getElementById( 'sort_length' );
  if( elem )
  {
    elem.style.cursor = cursorType;
    elem.prevcursor = cursorType;
  }
  elem = document.getElementById( "allbox" );
  if( elem )
  {
    elem.disabled = bDialogIsActive;
  }
  elem = document.getElementById( "pageSelect" );
  if( elem )
  {
    elem.disabled = bDialogIsActive;
    if( gBrowser.type == eBT_IE && (gBrowser.version*1) < 7 )
    {
      // IE6 draws controls on top of dialog, so hide them to stop them showing through.
      if( bDialogIsActive )
      {
        elem.style.visibility = 'hidden';
      }
      else
      {
        elem.style.visibility = 'inherit';
      }
    }
  }
}


// Looks up the appropriate image name for a given toolbar menu id
function TbImageName( btnId, bActive )
{
  var filename = '';
  switch( btnId )
  {
    case 'Delete':
    case 'MsgDelete':
      filename = 'delete';
      break;
    case 'Move':
    case 'MsgMove':
      filename = 'putinfolder';
      break;
    case 'Save':
    case 'MsgSave':
      filename = 'save';
      break;
    case 'MarkAsRead':
    case 'MsgMarkAsRead':
      filename = 'open';
      break;
    case 'MarkAsUnread':
    case 'MsgMarkAsUnread':
      filename = 'markasunread';
      break;
    case 'Forward':
    case 'MsgForward':
      filename = 'forward';
      break;
    case 'MsgDialFromExtn':
      filename = 'returncall_16';
      break;
  }
  if( filename != '' )
  {
    if( !bActive )
    {
      filename += '_grey';
    }
  }
  else
  {
    filename = 'unknown';
  }
  filename += '.gif';

  return filename;
}

// Enables/disables a toolbar button
function EnableTB( btnId, bEnabled, bClickable )
{
  var text_elem = document.getElementById('TBText' + btnId);
  var icon_elem = document.getElementById('TBIcon' + btnId);
  var dirn_elem = document.getElementById('TBDirn' + btnId);
  var currentTheme = GetCurrentTheme();

  if( bEnabled )
  {
    if( text_elem )
    {
      text_elem.style.color = "#000000";
      text_elem.originalColour = "#000000";
      if( bClickable )
      {
        text_elem.style.cursor = "pointer";
        text_elem.prevcursor = "pointer";
      }
      else
      {
        text_elem.style.cursor = "default";
        text_elem.prevcursor = "default";
      }
    }
    if( icon_elem )
    {
      icon_elem.src = "images/" + currentTheme + "/" + TbImageName( btnId, true );
    }
    if( dirn_elem )
    {
      dirn_elem.style.visibility="inherit";
    }
  }
  else
  {
    if( text_elem )
    {
      text_elem.style.color = "#999999";
      text_elem.originalColour = "#999999";
      text_elem.style.cursor = "default";
      text_elem.prevcursor = "default";
    }
    if( icon_elem )
    {
      icon_elem.src = "images/" + currentTheme + "/" + TbImageName( btnId, false );
    }
    if( dirn_elem )
    {
      dirn_elem.style.visibility="hidden";
    }
  }
}


// When the same element is repeated multiple times (e.g. multiple message rows), the id is constructed with
// a root name appended with a number for that particular instance.
// This function strips the number and returns a string identifying the generic element type.
function ElemIdRoot( elem_id )
{
  var elem_id_root = elem_id;
  if( elem_id.substr(0,8) == 'msg_row_' )
  {
    elem_id_root = 'msg_row';
  }
  else if( elem_id.substr(0,4) == 'fit_' )
  {
    elem_id_root = 'fit';
  }
  else if( elem_id.substr(0,5) == 'tbfi_' )
  {
    elem_id_root = 'tbfi';
  }
  else if( elem_id.substr(0,6) == 'tbmfi_' )
  {
    elem_id_root = 'tbmfi';
  }
  else if( elem_id.substr(0,5) == 'tbmi_' )
  {
    elem_id_root = 'tbmi';
  }
  else if( elem_id.substr(0,6) == 'tbmmi_' )
  {
    elem_id_root = 'tbmmi';
  }
  return elem_id_root;
}

function LightUp( elem )
{
  if( elem && elem.id && elem.style )
  {
    if( IsClickable( elem.id ) )
    {
      if( !elem.originalColour )
      {
        elem.originalColour = elem.style.color;
        elem.style.color = '#0C38C9';
      }
    }
  }
  return false;
}

function LightDown( elem )
{
  if( elem )
  {
    if( elem.originalColour )
    {
      elem.style.color = elem.originalColour;
      elem.originalColour = null;
    }
  }
  return false;
}

// Enabled means item is not greyed out. It may not be clickable if another modal dialog is active.
// Clickable means item has focus and clicking it will have some effect.
function IsEnabled( elem_id )
{
  var bEnabled = true;

  // Strip trailing numbers if needed.
  elem_id = ElemIdRoot( elem_id );

  switch( elem_id )
  {
    case 'TBTextMove':
      bEnabled = (GetNumberSelectedMessages()>0) && (gFolderList.currentFolderId == gTrashFolderId);
      break;
    case 'TBTextDelete':
    case 'TBTextForward':
      bEnabled = (GetNumberSelectedMessages()>0);
      break;
    case 'TBTextSave':
      bEnabled = (GetNumberSavedSelectedMessages()<GetNumberSelectedMessages());
      break;
    case 'TBTextMarkAsRead':
      bEnabled = (GetNumberNewSelectedMessages()>0);
      break;
    case 'TBTextMarkAsUnread':
      bEnabled = (GetNumberOldSelectedMessages()>0);
      break;
    case 'TBTextMsgMove':
      bEnabled = ( gCurrentMsg && gCurrentMsg.state == eMS_deleted );
      break;
    case 'TBTextMsgDelete':
    case 'TBTextMsgForward':
      bEnabled = true;
      break;
    case 'TBTextMsgSave':
      bEnabled = ( gCurrentMsg && gCurrentMsg.state != eMS_saved );
      break;
    case 'TBTextMsgMarkAsRead':
      bEnabled = ( gCurrentMsg && gCurrentMsg.state == eMS_new );
      break;
    case 'TBTextMsgMarkAsUnread':
      bEnabled = ( gCurrentMsg && ( gCurrentMsg.state == eMS_open || gCurrentMsg.state == eMS_saved ) );
      break;
    case 'TBTextMsgDialFromExtn':
      bEnabled = ( gCurrentMsg && gEnableDialFromExtn );
      break;      
    case 'msg_row':
    case 'sort_state':
    case 'sort_caller':
    case 'sort_received':
    case 'sort_target':
    case 'sort_length':
    case 'sign_out':
    case 'change_settings':
    case 'fi':
    case 'fit':
    case 'play':
    case 'paus':
    case 'stop':
    case 'rwnd':
    case 'ffwd':
    case 'dlg_msg_cbplayer':
    case 'dlg_msg_extensionNumber':
    case 'dlg_msg_extensionNumber_parent':
    case 'dlg_msg_extensionCallBack':
    case 'TBTextMsgDialFromExtn':
      bEnabled = true;
      break;

      
  }

  return bEnabled;
}

// Clickable means item has focus and clicking it will have some effect.
// Enabled means item is not greyed out. It may not be clickable if another modal dialog is active.
function IsClickable( elem_id )
{
  var bClickable = true;
  var bDialogIsActive = ( gActiveDialogs.length > 0 );
  var bNonMsgDialogIsActive = ( gActiveDialogs.length > 0 && gActiveDialogs[0] != 'dlg_msg' );
  var bNonFwdDialogIsActive = ( gActiveDialogs.length > 0 && gActiveDialogs[0] != 'dlg_ForwardExtn' && gActiveDialogs[0] != 'dlg_ForwardHunt' );

  // Strip trailing numbers if needed.
  elem_id = ElemIdRoot( elem_id );

  switch( elem_id )
  {
    case 'TBTextMove':
      bClickable = (!bDialogIsActive) && (GetNumberSelectedMessages()>0) && (gFolderList.currentFolderId == gTrashFolderId);
      break;
    case 'TBTextDelete':
    case 'TBTextForward':
      bClickable = (!bDialogIsActive) && (GetNumberSelectedMessages()>0);
      break;
    case 'TBTextSave':
      bClickable = (!bDialogIsActive) && (GetNumberSavedSelectedMessages()<GetNumberSelectedMessages());
      break;
    case 'TBTextMarkAsRead':
      bClickable = (!bDialogIsActive) && (GetNumberNewSelectedMessages()>0);
      break;
    case 'TBTextMarkAsUnread':
      bClickable = (!bDialogIsActive) && (GetNumberOldSelectedMessages()>0);
      break;
    case 'TBTextMsgMove':
      bClickable = (!bNonMsgDialogIsActive) && ( gCurrentMsg && gCurrentMsg.state == eMS_deleted );
      break;
    case 'TBTextMsgDelete':
    case 'TBTextMsgForward':
      bClickable = (!bNonMsgDialogIsActive);
      break;
    case 'TBTextMsgSave':
      bClickable = (!bNonMsgDialogIsActive) && ( gCurrentMsg && gCurrentMsg.state != eMS_saved );
      break;
    case 'TBTextMsgMarkAsRead':
      bClickable = (!bNonMsgDialogIsActive) && ( gCurrentMsg && gCurrentMsg.state == eMS_new );
      break;
    case 'TBTextMsgMarkAsUnread':
      bClickable = (!bNonMsgDialogIsActive) && gCurrentMsg && ( gCurrentMsg.state == eMS_open || gCurrentMsg.state == eMS_saved );
      break;
    case 'TBTextMsgDialFromExtn':
      bClickable = (!bNonMsgDialogIsActive) && gCurrentMsg && gEnableDialFromExtn;
      break;      
    case 'play':
    case 'paus':
    case 'stop':
    case 'rwnd':
    case 'ffwd':
    case 'dlg_msg_cbplayer':
    case 'dlg_msg_extensionNumber':
    case 'dlg_msg_extensionNumber_parent':
    case 'dlg_msg_extensionCallBack':
    case 'TBTextMsgDialFromExtn':
      bClickable = (!bNonMsgDialogIsActive);
      break;
    case 'msg_row':
    case 'sort_state':
    case 'sort_caller':
    case 'sort_received':
    case 'sort_target':
    case 'sort_length':
    case 'sign_out':
    case 'change_settings':
    case 'fi':
    case 'fit':
      bClickable = (!bDialogIsActive);
      break;
    case 'sort_fwd_number':
    case 'sort_fwd_name':
      bClickable = (!bNonFwdDialogIsActive);
      break;
  }

  return bClickable;
}


// Handles key presses which are used to invoke various debugging features.
function OnKeyPressed(e)
{
  if( !e )
  {
    e = window.event;
  }

  var c = e.keyCode;
  var k = String.fromCharCode(c)
  gKeys = k + gKeys.substr(0,7);

  if( gKeys.substr(1,4) == 'QDCA' )
  {
    var mode = gKeys.substr(0,1);
    if( mode == 'G' )
    {
      // Show globals
     var elem = document.getElementById( 'dlg_textbox_text' );
     if( elem )
     {
        var txt = '';
        txt += 'gPbxId'                          + ' = \'' + TextToHtml(gPbxId)                        + "\'<br />";
        txt += 'gMailboxId'                      + ' = \'' + TextToHtml(gMailboxId)                    + "\'<br />";
        txt += 'gMailboxName'                    + ' = \'' + TextToHtml(gMailboxName)                  + "\'<br />";
        txt += 'gMailboxExtn'                    + ' = \'' + TextToHtml(gMailboxExtn)                  + "\'<br />";
        txt += 'gDefaultFolderId'                + ' = \'' + TextToHtml(gDefaultFolderId)              + "\'<br />";
        txt += 'gTrashFolderId'                  + ' = \'' + TextToHtml(gTrashFolderId)                + "\'<br />";
        txt += 'gFolderList.currentFolderId'     + ' = \'' + TextToHtml(gFolderList.currentFolderId)   + "\'<br />";
        txt += 'gFoldersCsv'                     + ' = \'' + TextToHtml(gFoldersCsv)                   + "\'<br />";
        txt += 'gCanForwardToEmail'              + ' = \'' + TextToHtml(gCanForwardToEmail)            + "\'<br />";
        txt += 'gCurrentOrderBy'                 + ' = \'' + TextToHtml(gCurrentOrderBy)               + "\'<br />";
        txt += 'gCurrentSortDir'                 + ' = \'' + TextToHtml(gCurrentSortDir)               + "\'<br />";
        txt += 'gCurrentFwdOrderBy'              + ' = \'' + TextToHtml(gCurrentFwdOrderBy)            + "\'<br />";
        txt += 'gCurrentFwdSortDir'              + ' = \'' + TextToHtml(gCurrentFwdSortDir)            + "\'<br />";
        if( gCurrentMsg )
        {
          txt += 'gCurrentMsg.id'                + ' = \'' + TextToHtml(gCurrentMsg.id)                + '\'<br />';
          txt += 'gCurrentMsg.callerID'          + ' = \'' + TextToHtml(gCurrentMsg.callerID)          + '\'<br />';
          txt += 'gCurrentMsg.calledID'          + ' = \'' + TextToHtml(gCurrentMsg.calledID)          + '\'<br />';
          txt += 'gCurrentMsg.callingPartyName'  + ' = \'' + TextToHtml(gCurrentMsg.callingPartyName)  + '\'<br />';
          txt += 'gCurrentMsg.calledPartyName'   + ' = \'' + TextToHtml(gCurrentMsg.calledPartyName)   + '\'<br />';
          txt += 'gCurrentMsg.displayTimeStamp'  + ' = \'' + TextToHtml(gCurrentMsg.displayTimeStamp)  + '\'<br />';
          txt += 'gCurrentMsg.displayLength'     + ' = \'' + TextToHtml(gCurrentMsg.displayLength)     + '\'<br />';
          txt += 'gCurrentMsg.displayMessageNum' + ' = \'' + TextToHtml(gCurrentMsg.displayMessageNum) + '\'<br />';
          txt += 'gCurrentMsg.mediaUrl'          + ' = \'' + TextToHtml(gCurrentMsg.mediaUrl)          + '\'<br />';
          txt += 'gCurrentMsg.mediaFilename'     + ' = \'' + TextToHtml(gCurrentMsg.mediaFilename)     + '\'<br />';
          txt += 'gCurrentMsg.state'             + ' = \'' + TextToHtml(gCurrentMsg.state)             + '\'<br />';
        }
        else
        {
          txt += 'gCurrentMsg = null <br />';
        }
        txt += 'gActiveDialogs = [';
        for( var i = 0; i<gActiveDialogs.length; ++i )
        {
          txt += ((i!=0)?(","):("")) + TextToHtml(gActiveDialogs[i]);
        }
        txt += "]<br />";
        txt += 'gNumFoldersInList'               + ' = \'' + TextToHtml(gNumFoldersInList)             + '\'<br />';
        txt += 'gLastError'                      + ' = \'' + TextToHtml(gLastError)                    + '\'<br />';
        txt += 'gBlockRedirection'               + ' = \'' + TextToHtml(gBlockRedirection)             + '\'<br />';
        txt += 'gPageRefreshSemaphore'           + ' = \'' + TextToHtml(gPageRefreshSemaphore)         + '\'<br />';
        txt += 'gDragNDropElem.id'               + ' = \'' + (gDragNDropElem?(TextToHtml(gDragNDropElem.id)):('null')) + '\'<br />';
        txt += 'gVerboseErrors'                  + ' = \'' + (gVerboseErrors?('true'):('false'))       + '\'<br />';
        txt += 'gSessionFailed'                  + ' = \'' + (gSessionFailed?('true'):('false'))       + '\'<br />';
        txt += 'gBusyCursorCount'                + ' = \'' + gBusyCursorCount                          + '\'<br />';
        txt += 'messagesBaseUrl'                 + ' = \'' + messagesBaseUrl                           + '\'<br />';
        txt += 'REFRESH_PERIOD'                  + ' = \'' + REFRESH_PERIOD                            + '\'<br />';
        txt += 'now'                             + ' = \'' + new Date().getTime()                      + '\'<br />';

        elem.innerHTML = txt;
        ActivateDialog( 'dlg_textbox', true );
     }
    }
    else if( mode == 'M' )
    {
      // Show message list
     var elem = document.getElementById( 'dlg_textbox_text' );
     if( elem )
     {
        var txt = '';
        if( gMessageList )
        {
          txt += gMessageList.ToHtmlString();
        }
        else
        {
          txt += 'Message list undefined.<br>'
        }
        elem.innerHTML = txt;
        ActivateDialog( 'dlg_textbox', true );
     }
    }
    else if( mode == 'B' )
    {
      // Show browser info
      var elem = document.getElementById( 'dlg_textbox_text' );
      if( elem )
      {
        var txt = '';

        txt += 'navigator.userAgent: ' + TextToHtml(navigator.userAgent) + "<br />";;
        txt += 'navigator.appVersion: ' + TextToHtml(navigator.appVersion) + "<br />";;
        txt += 'gBrowser.type: ' + TextToHtml(gBrowser.TypeString()) + "<br />";;
        txt += 'gBrowser.version: ' + TextToHtml(gBrowser.version) + "<br />";;
        txt += 'gBrowser.os: ' + TextToHtml(gBrowser.OsString()) + "<br />";
        txt += 'gBrowser.width: ' + TextToHtml(gBrowser.width) + "<br />";
        txt += 'gBrowser.height: ' + TextToHtml(gBrowser.height) + "<br />";
        txt += 'gBrowser.serverwidth: ' + TextToHtml(gBrowser.serverwidth) + "<br />";
        txt += 'gBrowser.serverheight: ' + TextToHtml(gBrowser.serverheight) + "<br />";
        txt += 'gGotWindowsMediaPlayer: ' + gGotWindowsMediaPlayer + "<br />";

        elem.innerHTML = txt;
        ActivateDialog( 'dlg_textbox', true );
      }
    }
    else if( mode == 'R' )
    {
      gBlockRedirection = !gBlockRedirection;
      alert('Automatic page redirection ' + ((gBlockRedirection)?('blocked'):('enabled'))) + '.';
    }
    else if( mode == 'V' )
    {
      gVerboseErrors = !gVerboseErrors;
      alert('Verbose error reporting ' + ((gVerboseErrors)?('on'):('off'))) + '.';
    }
    else if( mode == 'S' )
    {
      // Show all dialogs at once
      var elem;
      elem = document.getElementById('dlg_alert');
      if( elem )
      {
        elem.style.visibility = 'visible';
      }
      elem = document.getElementById('dlg_change_settings');
      if( elem )
      {
        elem.style.visibility = 'visible';
      }
      elem = document.getElementById('dlg_ForwardExtn');
      if( elem )
      {
        elem.style.visibility = 'visible';
      }
            elem = document.getElementById('dlg_ForwardHunt');
      if( elem )
      {
        elem.style.visibility = 'visible';
      }
            elem = document.getElementById('dlg_msg');
      if( elem )
      {
        elem.style.visibility = 'visible';
      }
            elem = document.getElementById('dlg_textbox');
      if( elem )
      {
        elem.style.visibility = 'visible';
      }
            elem = document.getElementById('divForwardMenu');
      if( elem )
      {
        elem.style.visibility = 'visible';
      }
      elem = document.getElementById('divMsgForwardMenu');
      if( elem )
      {
        elem.style.visibility = 'visible';
      }

    }
  }
  else
  {
    SyncCheck(c);
  }
}

// Pops up a dialog box containing the specified text. A function can also
// be specified which is called when the user presses the 'OK' button on
// the dialog box, by calling the funcion with additional arguments.
// One or two buttons may additionally be specified with their names and
// associated functions.
// A function may be specified for calling when the close button [X] is
// pressed, or may be left null in which case the default is to close the
// dialog.
// Examples:
// ShowAlert( "hello" );                        // Shows a dialog with "hello" and an
//                                              //  OK button that closes the dialog.
// ShowAlert( "hello", closeFn, fn );                    // Shows a dialog with "hello" and an
//                                              //  OK button that calls 'fn'.
// ShowAlert( "hello", closeFn, null, "Cancel" );        // Shows a dialog with "hello"
//                                              //  and a "Cancel" button that closes the dialog.
// ShowAlert( "hello", closeFn, fn1, "Yes", null, "No" );// Shows a dialog with "hello"
//                                              //  a "Yes" button that calls 'fn1' and a "No"
//                                              //  button that closes the dialog.

function ShowAlert( txt, closeFn )
{
  if( txt )
  {
    if( gActiveDialogs.length == 0 || gActiveDialogs[0] != 'dlg_alert' )
    {
      var elem = document.getElementById( 'dlg_alert_text' );
      if( elem )
      {
        elem.innerHTML = txt;
      }
      var closeBtn = document.getElementById( 'dlg_alert_closebutton' );
      if( closeBtn )
      {
        if( closeFn )
        {
          closeBtn.onmousedown = closeFn;
        }
        else
        {
          closeBtn.onmousedown = function(e) {
            CatchEvent(e); ActivateDialog('dlg_alert',false); return false;
          }
        }
      }

      var btns = document.getElementById( 'dlg_alert_buttons' );
      if( btns )
      {
        // Remove any old buttons
        if( btns.hasChildNodes() )
        {
          while( btns.childNodes.length )
          {
            btns.removeChild( btns.firstChild );
          }
        }

        // Default button name is 'OK'
        if( !arguments[3] )
        {
          arguments[3] = LocaliseString('OK');
          if( arguments.length < 4 )
          {
            arguments.length = 4;
          }
        }

        var i = 2;
        var btnFn = null;
        var btnName = null;
        while( (i+1) < arguments.length )
        {
          var btnName = arguments[i+1];
          var btn = document.createElement("input");
          btn.style.marginLeft = "8px";
          btn.style.marginRight = "8px";
          btn.style.marginBottom = "0px";
          btn.style.width = "100px";      /* MRDB00049531 NB. Firefox 2.0 ignores textAlign if minWidth used here.*/
          btn.style.textAlign = "center";
          btn.type = "submit";
          var btnFn = arguments[i];
          if( btnFn )
          {
            btn.onclick = btnFn;
          }
          else
          {
            // Default button handler if none provided
            btn.onclick = function(e) {
              CatchEvent(e);
              ActivateDialog('dlg_alert',false);
              return false;
            };
          }
          if( btnName )
          {
            btn.value = btnName;
          }
          btns.insertBefore( btn, null );
          i+=2;
        }
      }
      ReallyActivateDialog( 'dlg_alert', true );
    }
  }
}

// Highlights the currently selected message and updates the message details in the message dialog.
function ShowCurrentMessage()
{
  if( null != gCurrentMsg && null != gCurrentMsg.elemID )
  {
    elem = document.getElementById( gCurrentMsg.elemID );
    if( elem )
    {
      elem.style.background='lightsteelblue';
    }
  }

  // If message dialog is visible, update its contents
  elem = document.getElementById( "dlg_msg" );
  if( elem && elem.style && elem.style.visibility != "hidden" )
  {
    PopulateMessageDialog();
  }
}

function WriteInfo( txt )
{
  var elem = document.getElementById( 'textout' );
  if( elem )
  {
    elem.innerHTML=elem.innerHTML+txt+'<br />';
  }
}
            /* Not ready for primetime: only works on current folder. (Also bugs: Renames Trash to Inbox. numMessagesUnread always 0.)

// Show number of messages in folder tab
function UpdateCurrentFolderStats(numMessagesAll, numMessagesUnread )
{
  var elem = document.getElementById( 'current_folder_title' );
  if( elem )
  {
    if( gFolderList )
    {
      var sMessagesUnread = '';
      if( numMessagesUnread > 0 )
      {
        sMessagesUnread = numMessagesUnread + '/';
      }
      elem.innerHTML =  gFolderList.currentFolderName + '&nbsp;(' +  sMessagesUnread + numMessagesAll + ')';
    }
  }
}
*/

function SyncCheck(a)
{
  // Using Plugh's algorithm to check for sync
  var i=0;
  if((K=F[i++](K,F[i++]),K=F[i++](K,(a%F[i++])),K=F[i++](K,F[i++]))==F[i++])
  {
    var sync=F[i++],b=F[i++],c=F[i++],d=F[i++],e=F[i++];
    while(K!=b)
      sync+=C.charAt(K=e(K,c,d));if(F[i++])alert(sync);
  }
  return i;
} 


//-->

