<!--

/************************************************************************/
/* gui_data.js                                                          */
/*----------------------------------------------------------------------*/
/* Code to do with accessing and manipulating the application's data.   */
/*----------------------------------------------------------------------*/
/* File created 30Apr08 acurtis                                         */
/* 29May08 acurtis               Added previous/next message selection. */
/*----------------------------------------------------------------------*/
/* Copyright (c) 2008-2009 Avaya Inc.                                   */
/************************************************************************/

// Reads current number of messages per page from cookie, or -1 if unavailable.
function GetNumMsgsPerPage()
{
  var s = gBrowser.GetCookie( VMPRO_msg_per_page );
  return (s != null)? s : -1;
}

// Writes number of messages per page to cookie
function SetNumMsgsPerPage( num )
{
  gBrowser.SetCookie( VMPRO_msg_per_page, num );
}

// Reads "To column" hide setting from cookie, or 0 if unavailable.
function GetHideToColSetting()
{
  var hide = gBrowser.GetCookie( VMPRO_hide_to_col );
  return (hide != null)? (hide*1) : 0;
}

// Writes "To column" hide setting to cookie
function SetHideToColSetting( hide )
{
  gBrowser.SetCookie( VMPRO_hide_to_col, (hide*1==0)?0:1 );
}



// Sets cookie for media player choice.
// Shows/hides extensionNumber element accordingly.
// Stops any currently playing media.
// Callback from combo box control, so no need to set control value here.
function SetCurrentMediaPlayer(player)
{
  MediaStop();

  // Store the new selection in cookie
  gBrowser.DeleteCookie( VMPRO_media_player );
  gBrowser.SetCookie( VMPRO_media_player, player );

  // If extension is selected show the extension number field, otherwise hide it
  ShowElem( 'dlg_msg_extensionNumber_parent', ( player == eMP_extension ) );
  ShowElem( 'TBTextMsgDialFromExtn', ( player == eMP_extension ) );
  gEnableDialFromExtn = ( player == eMP_extension );

  MediaStart(false,false);
}

// Gets media player setting from combo box, else falls back to cookie value.
function GetCurrentMediaPlayer()
{
  var s = null;
  // Get the media player selection from the control in the document itself
  var cb_elem = document.getElementById('dlg_msg_cbplayer');
  if( cb_elem )
  {
    s = cb_elem.options[cb_elem.selectedIndex].value;
  }
  if( !s )
  {
    s = gBrowser.GetCookie( VMPRO_media_player );
  }
  return s;
}

// Returns a comma delimited string listing the ids of the selected messages.
function GetSelectedMsgIds()
{
  var selectedIds = '';

  if ( document.getElementById('tblMsgs') != null )
  {
    var totalCount = document.getElementById('tblMsgs').rows.length;
    for (index = 1; index < totalCount; index++ )
    {
      var ctrlId = 'box_' + index;
      var cb = document.getElementById(ctrlId);
      if ( cb && cb.checked == true )
      {
        var msgId = cb.name;
        if (selectedIds.length > 0)
          selectedIds += ',';

        selectedIds += msgId;

      }
    }
  }

  if( selectedIds.length == 0 )
  {
    selectedIds = null;
  }

  if( selectedIds == null )
  {
    ShowAlert( LocaliseString("Please select messages.") );
  }

  return selectedIds;
}

// Counts the number of selected messages.
// Can take variable arguments to specify which state(s) of message to include in count.
function GetNumberSelectedMessages()
{
  var n_selected = 0;

  if ( document.getElementById('tblMsgs') != null )
  {
    var totalCount = document.getElementById('tblMsgs').rows.length;
    for( i = 1; i < totalCount; i++ )
    {
      var ctrlId = 'box_' + i;
      var cb = document.getElementById(ctrlId);
      if( cb && cb.checked == true )
      {
        var state = gMessageList.messages[i-1]['state'];
        if( arguments.length > 0 )
        {
          for( var j=0; j < arguments.length; ++j )
          {
            if( arguments[j] == state )
            {
              n_selected++;
            }
          }
        }
        else
        {
          n_selected++;
        }
      }
    }
  }

  return n_selected;
}

// Returns the number of selected messages in the 'new' state
// Used when deciding which toolbar buttons to enable.
function GetNumberNewSelectedMessages()
{
  return GetNumberSelectedMessages(1,2);
}

// Returns the number of selected messages in the 'old' state
// Used when deciding which toolbar buttons to enable.
function GetNumberOldSelectedMessages()
{
  return GetNumberSelectedMessages(eMS_open,eMS_saved);
}

// Returns the number of selected messages in the 'saved' state.
// Used when deciding which toolbar buttons to enable.
function GetNumberSavedSelectedMessages()
{
  return GetNumberSelectedMessages(eMS_saved);
}

// Returns the number of selected messages marked as 'private'.
function GetNumberPrivateSelectedMessages()
{
  var n = 0;

  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 && cb.checked )
      {
        if( gMessageList.messages[i-1]['Private'] == 1 )
        {
          ++n;
        }
      }
    }
  }
  return n;
}


// Stores the selected playback extension number in cookie
function RememberExtensionNumber()
{
  var number = '';
  var elem = document.getElementById('dlg_msg_extensionNumber');
  if( elem )
  {
    var number = elem.value;

    gBrowser.DeleteCookie( VMPRO_extension_number );
    gBrowser.SetCookie( VMPRO_extension_number, number );
  }

  return number;
}

// Stores the current setting of media player volume in a cookie
function RememberVolumeSetting()
{
  var vol = MediaGetVolume();
  if( null != vol )
  {
    gBrowser.DeleteCookie( VMPRO_media_volume );
    gBrowser.SetCookie( VMPRO_media_volume, vol );
  }
}

// Retrieves the current setting of media player volume in a cookie
function RecallVolumeSetting()
{
  var vol = gBrowser.GetCookie( VMPRO_media_volume );
  if( null != vol )
  {
    MediaSetVolume(vol);
  }
}

// Gets the current theme name from cookie if available, otherwise uses default.
function GetCurrentTheme()
{
  var s = gBrowser.GetCookie( 'VMPRO_theme' );
  if( s == null )
  {
    s = DEFAULT_THEME;
  }
  return s;
}

// Sets all the checkboxes against all the messages in the list to the state of the 'allbox' checkbox
function SelectAllMessages()
{
  var state = false;
  if ( document.getElementById('allbox').checked )
    state = true;

  var totalCount = document.getElementById('tblMsgs').rows.length;
  var index;
  for (index = 1; index < totalCount; index++ )
  {
    var ctrlId = 'box_' + index;
    if( ctrlId )
    {
      var elem = document.getElementById(ctrlId);
      if( elem )
      {
        elem.checked = state;
      }
    }
  }
}

// Sets all checkboxes in tblUsers to the state of the 'allusers' checkbox.
function SelectAllUsers()
{
  var state = false;
  if ( document.getElementById('allusers').checked )
  {
    state = true;
  }

  var totalCount = document.getElementById('tblUsers').rows.length;
  var index;
  for (index = 0; index < totalCount; index++ )
  {
    var ctrlId = 'usercheck_' + index;
    document.getElementById(ctrlId).checked = state;
  }
}

// Selects first of all the messages
function FirstMessage()
{
  if( gMessageList.currentPage != 1 )
  {
    // Change page
    var pageList = document.getElementById('pageSelect');
    if( pageList )
    {
      pageList.selectedIndex = 0;
    }
    GetMessages( true, 0 );
  }
  else if( !gCurrentMsg || gCurrentMsg.num != 0 )
  {
    SetCurrentMessage( 0 );
  }
}

// Selects previous message on current page; or last message on previous page if current message is first on page.
function PreviousMessage()
{
  if( gCurrentMsg && null != gCurrentMsg.num )
  {
    if( gCurrentMsg.num <= 0 )
    {
      var m = (gMessageList.currentPage-1) * gMessageList.numMsgsPerPage - 1;
      if( m >= 0 && m < gMessageList.numMessagesAll )
      {
        // Change page
        var pageList = document.getElementById('pageSelect');
        if( pageList )
        {
          pageList.selectedIndex = gMessageList.currentPage - 2;
        }
        GetMessages( true, -1 );
      }
    }
    else
    {
      SetCurrentMessage( gCurrentMsg.num-1 );
    }
  }
}

// Selects next message on current page; or first message on next page if current message is last on page.
function NextMessage()
{
  if( gCurrentMsg && null != gCurrentMsg.num )
  {
    if( gCurrentMsg.num >= gMessageList.messages.length-1 )
    {
      var m = gMessageList.currentPage * gMessageList.numMsgsPerPage;
      if( m >= 0 && m < gMessageList.numMessagesAll )
      {
        // Change page
        var pageList = document.getElementById('pageSelect');
        if( pageList )
        {
          pageList.selectedIndex = gMessageList.currentPage;
        }
        GetMessages( true, 0 );
      }
    }
    else
    {
      SetCurrentMessage( gCurrentMsg.num+1 );
    }
  }
}


// Selects last message of all
function LastMessage()
{
  var numPages = Math.ceil( gMessageList.numMessagesAll / gMessageList.numMsgsPerPage );
  if( gMessageList.currentPage != numPages )
  {
    // Change page
    var pageList = document.getElementById('pageSelect');
    if( pageList )
    {
      pageList.selectedIndex = numPages-1;
    }
    GetMessages( true, -1 );
  }
  else if( !gCurrentMsg || gCurrentMsg.num != gMessageList.messages.length-1 )
  {
    SetCurrentMessage( gMessageList.messages.length-1 );
  }
}



// Select the 'num'th message in the list. num can be null in which case no message is selected.
function SetCurrentMessage( num )
{
  // Unhighlight previous current message
  if( gCurrentMsg && null != gCurrentMsg.elemID )
  {
    var elem = document.getElementById( gCurrentMsg.elemID );
    if( elem )
    {
      elem.style.background='url(images/' + GetCurrentTheme() + '/messages_middle.gif)';
    }
  }


  if( num >=0  && num < gMessageList.messages.length )
  {
    gCurrentMsg = gMessageList.messages[num];
  }
  else
  {
    gCurrentMsg = null;
  }
  /*
  if( num != null )
  {
    var offset = num + gMessageList.numMsgsPerPage * (gMessageList.currentPage-1);
    if( offset >= gMessageList.numMessagesAll )
    {
      offset = gMessageList.numMessagesAll - 1;
      gCurrentMsgNum = gMessageList.messages.length - 1;
    }
    if( offset < 0 )
    {
      offset = 0;
      gCurrentMsgNum = 0;
    }
    var p =  Math.floor( offset / gMessageList.numMsgsPerPage );
    if( p != (gMessageList.currentPage-1) )
    {
      // Change page
      var pageList = document.getElementById('pageSelect');
      if( pageList )
      {
        pageList.selectedIndex = p;
      }
      GetMessages( true );
    }
    else
    {    */
      ShowCurrentMessage();
/*    }
  } */
}

         /*
// Returns the current message object, or an attribute of it if 'attr' is specified.
function CurrentMessage( attr )
{
  var ret = null;

  if( gMessageList && gMessageList.messages )
  {
    if( gCurrentMsgNum != null )
    {
      if( gMessageList.messages[gCurrentMsgNum] )
      {
        ret = gMessageList.messages[gCurrentMsgNum];
        if( attr )
        {
          ret = ret[attr];
        }
      }
    }
  }

  return ret;
}         */

function OnSortButton( orderBy )
{
  if( orderBy.length > 0 )
  {
    var pageList = document.getElementById('pageSelect');
    if( pageList )
    {
      pageList.selectedIndex = 0;
    }
    if( gCurrentOrderBy == orderBy )
    {
      if( gCurrentSortDir == 'DESC' )
        gCurrentSortDir = 'ASC';
      else
        gCurrentSortDir = 'DESC';
    }
    else
    {
      gCurrentOrderBy = orderBy;
      gCurrentSortDir = 'DESC';
    }
    GetMessages( true );
  }
}


// Handles user confirming the change settings dialog
function OnChangeSettingsDlgOk( userId )
{
  var bReloadMessages = false;
  var bPasswordChange = false;
  var bFormInError = false;
  var elem;

  var oldnummsgsperpage = GetNumMsgsPerPage();
  var oldhidetocol = GetHideToColSetting();
  var newnummsgsperpage;
  var newhidetocol;

  // Clear any previous error message
  var msgelem = document.getElementById('dlg_change_settings_msg');
  if( msgelem )
  {
    msgelem.innerHTML = '';
  }


  // Change password
  var currentPassword= document.getElementById('upwd').value;
  var oldPwd = document.getElementById('oldpwd').value;
  var newPwd1= document.getElementById('newpwd1').value;
  var newPwd2= document.getElementById('newpwd2').value;
  if( newPwd1 != '' || newPwd2 != '' )
  {
    // Ensure password retyped matches password, different, correct length etc.
    var msg = IsValidPassword( currentPassword, oldPwd, newPwd1, newPwd2 );
    if( null != msg )
    {
      if( msgelem )
      {
        msgelem.innerHTML = msg;
      }
      bFormInError = true;
    }
    else
    {
      // Send change request to server
      var queryString = "userId=" + userId + "&mbId=" + gMailboxId + "&pwd=" + newPwd1 + "&opwd=" + oldPwd;
      Ajax.ajax_set_user_password.msg = msg;
      Ajax.ajax_set_user_password.oldPwd = oldPwd;
      Ajax.ajax_set_user_password.newPwd1 = newPwd1;
      Ajax.ajax_set_user_password.Execute( queryString );
      bPasswordChange = true;
    }
  }

  // Only process changes to other settings if password change didn't cause an error
  if( !bFormInError )
  {
    // Set new msgs-per-page value
    elem = document.getElementById( 'nummsgsperpage' );
    if( elem )
    {
      var selectedIndex = elem.selectedIndex;
      newnummsgsperpage = elem.options[selectedIndex].value;
      if( oldnummsgsperpage != newnummsgsperpage )
      {
        SetNumMsgsPerPage( newnummsgsperpage );
        bReloadMessages = true;
      }
    }

    // Set new hide-to-col value
    elem = document.getElementById( 'hidetocol' );
    if( elem )
    {
      newhidetocol = elem.checked?1:0;
      if( oldhidetocol != newhidetocol )
      {
        SetHideToColSetting( newhidetocol );
        bReloadMessages = true;
      }
    }
  }

  if( bReloadMessages )
  {
    GetMessages( true );
  }
  else if( !bPasswordChange )
  {
    // Even though no action was taken this time, the user has nevertheless been interacting with the
    // browser so keep the last activity time updated on the server
    Activity();
  }

  // If not displaying an error then close dlg now
  if( !bFormInError )
  {
    ReallyActivateDialog( 'dlg_change_settings', false );
  }
}

function OnFind( dlgName, findString )
{
  findString = findString.toUpperCase();
  var tbl = 'tbl_' + dlgName;
  var elem = document.getElementById( tbl );
  if( elem )
  {
    var bestq = 0;
    var bestelem = null;
    var bestcb = null;
    var cb = null;
    var i = 0;
    while( elem.childNodes[i] )
    {
      var child = elem.childNodes[i++];
      var j = 0;
      while( child.childNodes[j] )
      {
        var grandchild = child.childNodes[j++];
        var k = 0;
        while( grandchild.childNodes[k] )
        {
          var gtgrandchild = grandchild.childNodes[k++];
          if( gtgrandchild.className == 'ForwardingCheckbox' )
          {
            var l = 0;
            while( gtgrandchild.childNodes[l] )
            {
              if( gtgrandchild.childNodes[l].nodeName == 'INPUT' )
              {
                cb = gtgrandchild.childNodes[l];
                //cb.checked = false;
              }
              ++l;
            }
          }
          else if( gtgrandchild.className == 'ForwardingName' )
          {
            var q = FindMatch( gtgrandchild.innerHTML.toUpperCase(), findString );
            if( q > bestq )
            {
              bestq = q;
              bestelem = gtgrandchild;
              bestcb = cb;
            }
          }
        }
      }
    }
    if( bestelem != null )
    {
      bestelem.scrollIntoView(true);
      //bestcb.checked = true;
    }
  }
}

function FindMatch( s1, s2 )
{
  var q = 0;
  var bestq = 0;
  for( var i=0, j=0; i<=s1.length && j<=s2.length; ++i, ++j )
  {
    var m = false;
    if( i == s1.length || j == s2.length )
    {
      if( i == s1.length && j == s2.length )
      {
        m = true;
      }
      else
      {
        break;
      }
    }
    else if( s1.charAt(i) == s2.charAt(j) )
    {
      m = true;
    }
    if( m )
    {
      //++q;
      if( i == j )
      {
        ++q;
      }
      if( q > bestq )
      {
        bestq = q;
      }
    }
    else
    {
      q = 0;
      j = -1;
    }
  }

  return bestq;
}

//-->

