<!--

/************************************************************************/
/* ajax.js                                                              */
/*----------------------------------------------------------------------*/
/* Javascript to call ajax scripts on server and handle their           */
/* responses.                                                           */
/*----------------------------------------------------------------------*/
/* 15Apr08 acurtis            File created from ajax_handlers.js        */
/*----------------------------------------------------------------------*/
/* Copyright (c) 2008-2009 Avaya Inc.                                   */
/************************************************************************/

var Ajax = function()
{
  // Handling of the actual ajax request to the web server.
  function Transaction(url, callbackFunction)
  {
    var that=this;
    this.updating = false;
    this.abort = function()
    {
      if (that.updating) {
        that.updating=false;
        that.AJAX.abort();
        that.AJAX=null;
      }
    }
    this.Execute = function( passData, postMethod, bNoBusyCursor )
    {
      if( gSessionFailed || that.updating )
      {
        return false;
      }
      that.bNoBusyCursor = bNoBusyCursor;
      if( self.SetBusyCursor && !bNoBusyCursor )
      {
        SetBusyCursor( true );
      }
      that.AJAX = null;
      if( window.XMLHttpRequest )
      {
        that.AJAX = new XMLHttpRequest();
      }
      else
      {
        that.AJAX = new ActiveXObject("Microsoft.XMLHTTP");
      }
      if( that.AJAX==null )
      {
        return false;
      }
      else
      {
        that.AJAX.onreadystatechange = function()
        {
          if( that.AJAX && that.AJAX.readyState==4 )
          {
            that.updating=false;
            if( self.SetBusyCursor && !that.bNoBusyCursor )
            {
              SetBusyCursor( false );
            }
            var responseText = that.AJAX.responseText;
            var status = that.AJAX.status;
            var responseXML = that.AJAX.responseXML;
            that.AJAX=null;
            if( that.callback )
            {
              that.callback( urlCall, responseText, status, responseXML );
            }
          }
        }
        that.updating = new Date();
        if( !passData || /get/i.test(postMethod) )
        {
          var uri=urlCall+'?'+ (passData?(passData+'&'):'') + 'timestamp='+(that.updating.getTime());
          that.AJAX.open("GET", uri, true);
          that.AJAX.send(null);
        }
        else
        {
          var uri=urlCall+'?'+that.updating.getTime();
          that.AJAX.open("POST", uri, true);
          that.AJAX.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
          that.AJAX.setRequestHeader("Content-Length", passData.length);
          that.AJAX.send(passData);
        }
        return true;
      }
    }
    var urlCall = url;
    this.callback = callbackFunction;
  }


  // Checks response from ajax transaction to see if it was successful.
  // Handles error and prints message if unsuccessful.
  function ValidateResponse( url, responseText, responseStatus, bShowErrors, bCloseActiveDialog )
  {
    var result = false;
    var ajaxDisplay = document.getElementById('divMsgs');
    if( responseStatus == 200 )
    {
      // Error results are encoded : type_of_error+++ajax_request+++error_specific_info
      // Results not in this format are assumed to be valid successful responses.
      // NB. No escaping has yet been implemented to cope with +++ strings in valid data!
      var ret = responseText.split("+++");
      if( ret.length == 3 )
      {
        // Got an error result
        if( bCloseActiveDialog && gActiveDialogs.length > 0 )
        {
          // Force any current dialog box to close
          ReallyActivateDialog('none');
        }

        if( ret[0] == 'auth' )
        {
          // Authentication failed. Direct user back to login screen.
          var msg = '';

          switch( ret[2] )
          {
            case AUTH_OFFLINE:
              msg = LocaliseString('This session has been disconnected.');
              break;          	
            case AUTH_EXPIRED:
              msg = LocaliseString('Your session has been idle for too long and has been disconnected.');
              break;
            case AUTH_NOSESSION:
              msg = LocaliseString('Your session has ended.');
              break;			              
            case AUTH_NULL:
            case AUTH_SUCCESS:
            case AUTH_NOSERVER:
            case AUTH_SERVER:
            case AUTH_NOUSER:
            default:
              msg = LocaliseString('Your session has been disconnected.');
              break;
          }
          // No session, so prevent further ajax requests as they could only fail.
          gSessionFailed = true;
          if( bShowErrors )
          {
            // Callback for alert box buttons
            function CloseAlertAndLogout(e)
            {
              CatchEvent(e);
              if( !gBlockRedirection )
              {
                window.location = 'login.php';
              }
              return false;
            }
            ShowAlert( msg, CloseAlertAndLogout, CloseAlertAndLogout );
          }

        }
        else
        {
          if( bShowErrors )
          {
            // Show error specific info
            ShowAlert( TextToHtml(ret[2]) );
          }
        }
        gLastError = responseText;
      }
      else
      {
        // Ajax request was successful
        result = true;
      }
    }
    else
    {
      gLastError = "Network error " + responseStatus + " while accessing " + url;
      if( gVerboseErrors )
      {
        ShowAlert( gLastError );
      }
      else
      {
        ShowAlert( LocaliseString( 'A network problem was encountered. Please try later.' ) );
      }
    }
    return result;
  }



  // Callback for ajax_logout
  function LogoutCallback( url, responseText, responseStatus )
  {
    // No other option but to return to login screen regardless of whether logout was successful.
    if( !gBlockRedirection )
    {
      window.location = 'login.php';
    }
  }

  // Callback for ajax_get_mailboxes
  function GetMailboxesCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }

    if( ValidateResponse( url, responseText, responseStatus, true, true ) )
    {
      if ( responseText.length > 0 )
      {
        var lists = responseText.split(';;');
        gExtnList = lists[0];
        gHGList = lists[1];
      }
      else
      {
        gExtnList = null;
        gHGList = null;
      }
    }
  }

  // Callback for ajax_forward_messages
  function ForwardMessagesCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }

    if( ValidateResponse( url, responseText, responseStatus, true, true ) )
    {
      if( responseText )
      {
        // Hide forwarding list
        ReallyActivateDialog('none');
        // Fetch and show message list
        GetMessages( true );
      }
      else
      {
        ShowAlert( LocaliseString("Forward failed.") );
      }
    }
  }

  // Callback for ajax_move_message and ajax_delete_message etc..
  // Callback that handles error responses, and refreshes mailbox list if request was successful.
  function RefreshingCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }

    if( ValidateResponse( url, responseText, responseStatus, true, true ) )
    {
      // Fetch and show message list
      GetMessages( true );
    }
  }

  // Callback for ajax_update_message
  function UpdateMessageCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }

    if( ValidateResponse( url, responseText, responseStatus, true, true ) )
    {
      // Change the state icon to indicate new message state
      if( document.getElementById('tblMsgs') != null )
      {
        var state = Ajax.ajax_update_message.state;
        var currentTheme = GetCurrentTheme();
        var totalCount = document.getElementById('tblMsgs').rows.length;
        var affectedMessages = Ajax.ajax_update_message.msgIds.split(',');
        for( var index = 0; index < totalCount; index++ )
        {
          var ctrlId;
          var cb;
          var msgId;
          if( index == 0 )
          {
            // Check current message first
            if( gCurrentMsg )
            {
              msgId = gCurrentMsg.id;
            }
            else
            {
              msgId = "";
            }
          }
          else
          {
            // Checkbox name is actually the message id
            ctrlId = 'box_' + index;
            cb = document.getElementById(ctrlId);
            if( cb )
            {
              msgId = cb.name;
            }
          }

          // IE doesn't implement Array.indexOf()
          var foundMsgId = false;
          for( var i=0; i<affectedMessages.length; i++ )
          {
            var affectedMessage = affectedMessages[i].replace(/^\{|\}$/g, '');
            if( affectedMessage == msgId )
            {
              foundMsgId = true;
              break;
            }
          }

          if( foundMsgId )
          {
            var state_var = eMS_unknown;
            switch( state )
            {
              case 'N':
                state_var = eMS_new;
                break;
              case 'O':
                state_var = eMS_open;
                break;
              case 'S':
                state_var = eMS_saved;
                break;
              case 'D':
                state_var = eMS_deleted;
                break;
              default:
                state_var = eMS_unknown;
                break;
            }

            if( index == 0 )
            {
              gCurrentMsg.state = state_var;
            }
            else
            {

              if( gMessageList.messages[index-1] )
              {

                gMessageList.messages[index-1].state = state_var;
              }
              var row = document.getElementById('msg_row_' + index);
              var div = document.getElementById('msgState_' + index);
              if( row && div )
              {


                switch( state_var )
                {
                  case eMS_new:
                    row.style.fontWeight = "bold";
                    div.innerHTML = '<img src="images/' + currentTheme + '/unread.gif" alt="' + LocaliseString('un-opened message')+'" />';

                    break;
                  case eMS_open:
                    row.style.fontWeight = "normal";
                    div.innerHTML = '<img src="images/' + currentTheme + '/open.gif" alt="' + LocaliseString('previously opened message')+'" />';
                    break;
                  case eMS_saved:
                    row.style.fontWeight = "normal";
                    div.innerHTML = '<img src="images/' + currentTheme + '/save.gif" alt="' + LocaliseString('saved message')+'" />';
                    break;
                  case eMS_deleted:
                    row.style.fontWeight = "normal";
                    div.innerHTML = '<img src="images/' + currentTheme + '/trash.gif" alt="' + LocaliseString('message flagged for deletion')+'" />';
                    break;
                  default:
                    row.style.fontWeight = "normal";
                    div.innerHTML = '<img src="images/' + currentTheme + '/unknown.gif" alt="' + LocaliseString('unknown message state')+'" />';
                    break;
                }
                var priority = gMessageList.messages[index-1].priority;
                if( priority == 1 )
                {
                  div.innerHTML += '<img style="margin-left:-16px;" src="images/' + currentTheme + '/priority.gif" alt="' + LocaliseString('priority message')+'" />';
                }
                var privateMsg = gMessageList.messages[index-1].privat;
                if( privateMsg == 1 )
                {
                  div.innerHTML += '<img style="margin-left:-16px;" src="images/' + currentTheme + '/private.gif" alt="' + LocaliseString('private message')+'" />';
                }
              }
            }
          }
        }
        RedrawToolbar();
        RedrawMsgToolbar();
        UpdateMessageDlg();
      }
    }
  }

  // Callback for ajax_get_messages
  function GetMessagesCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }

    if( gPageRefreshTimer )
    {
      window.clearTimeout( gPageRefreshTimer );
      gPageRefreshTimer = null;
    }

    if( ValidateResponse( url, responseText, responseStatus, true, true ) )
    {
      // All is good, we can show messages.
      if( responseText != "nochange" )
      {
        /* responseText is in the following format
        totalNumMessages|numMessagesUnread;
        msgGuid|caller id|called id|calling party name|date|private|priority|state|length|media location;
        ...
        msgGuid|caller id|called id|calling party name|date|private|priority|state|length|media location;
        ***************************************************************************************************/
        var msgsPerPage = Ajax.ajax_get_messages.amount;
        var offset = Ajax.ajax_get_messages.offset;

        gMessageList = new MessageList( offset, msgsPerPage, Ajax.ajax_get_messages.mailboxName, Ajax.ajax_get_messages.folderId, responseText );

        // If we got here by prev/next action, move to bottom/top of list as appropriate
        if( gCurrentMsg && null != Ajax.ajax_get_messages.nNewSelection)
        {
          if( gMessageList.messages.length == 0 )
          {
            gCurrentMsg = null;
          }
          else
          {
            var currentMsgNum = Ajax.ajax_get_messages.nNewSelection;
            if( currentMsgNum > gMessageList.messages.length )
            {
              currentMsgNum = gMessageList.messages.length;
            }
            else if( currentMsgNum < 0 )
            {
              currentMsgNum = gMessageList.messages.length-1;
            }
            gCurrentMsg = gMessageList.messages[currentMsgNum];
          }
        }

        var ajaxDisplay = document.getElementById('divMsgs');
        ajaxDisplay.innerHTML = gMessageList.ToHtml( GetCurrentTheme(), GetHideToColSetting() );

        // Show number of messages in folder tab
//        UpdateCurrentFolderStats( gMessageList.numMessagesAll, gMessageList.numMessagesUnread );

        // Hide all sort images
        ShowElem( 'state_sort', false );
        ShowElem( 'from_sort', false );
        ShowElem( 'to_sort', false );
        ShowElem( 'date_sort', false );
        ShowElem( 'length_sort', false );

        var img = new Image();
        if( Ajax.ajax_get_messages.currentSortDir == 'DESC' )
        {
          img.src="images/" + GetCurrentTheme() + "/sort_desc.gif";
        }
        else
        {
          img.src="images/" + GetCurrentTheme() + "/sort_asc.gif";
        }

        var sort_col = Ajax.ajax_get_messages.currentOrderBy + "_sort";
        var elem_sort_col = document.getElementById( sort_col );
        if( elem_sort_col )
        {
          elem_sort_col.style.visibility = 'inherit';
          elem_sort_col.src = img.src;
        }

        RedrawMessageList();
        RedrawToolbar();
        RedrawMsgToolbar();
        ShowCurrentMessage();
        UpdateMessageDlg();
      }

      // Prepare next refresh
      ResetAutoRefreshTimer();
    }
  }

  // Callback for ajax_set_user_password
  function SetUserPasswordCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }
    if( ValidateResponse( url, responseText, responseStatus, true, true ) )
    {
      document.getElementById('upwd').value = Ajax.ajax_set_user_password.newPwd1;
      ShowAlert( LocaliseString("Password has been successfully changed.") );
    }
  }

  // Callback for ajax_update_message
  function SimpleUpdateMessageCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }

    if( ValidateResponse( url, responseText, responseStatus, true, true ) )
    {
      // Update state icon that message has been played
      var priority = document.getElementById( Ajax.ajax_simple_update_message.priorityid ).value;
      var currentTheme = GetCurrentTheme();
      var divState = document.getElementById( Ajax.ajax_simple_update_message.stateId );

      if (priority == 1)
      {
        document.getElementById( Ajax.ajax_simple_update_message.msgstatedivimg ).innerHTML= "<img src='images/" + currentTheme + "/priority.gif' alt='priority message' />";
      }
      else
      {
        document.getElementById( Ajax.ajax_simple_update_message.msgstatedivimg ).innerHTML= "<img src='images/" + currentTheme + "/normal.gif' alt='normal message' />";
      }
      if( divState )
      {
        divState.value = 4;
      }
      document.getElementById( Ajax.ajax_simple_update_message.msgstatedivimg ).innerHTML+="<img src='images/" + currentTheme + "/open.gif' alt='previously opened message' />";
    }
  }

  // Callback for ajax_media_monitor
  // Called when media file is no longer in an "open" state.
  function MediaMonitorCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }

    // Did comet connection time out?
    var try_again = false;
    if( ValidateResponse( url, responseText, responseStatus, true, true ) )
    {
      if( responseText == 'timeout' )
      {
        // Timeout ocurred so we need to reconnect
        try_again = true;
      }
    }

    // Comet connection timed out, so establish it again
    if( try_again )
    {
      Ajax.ajax_media_monitor.Execute('','',true);
    }
    else
    {
      // Set controls and session state to 'stopped'
      OnStop();

      // Mark new message as read now that it's been (at least partially) heard
      if( Ajax.ajax_media_play.msgState == eMS_new )
      {
        UpdateMessageState( Ajax.ajax_media_play.msgId, 'O');
      }

    }
  }

  // Callback for ajax_media_create
  function MediaCreateCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }

    if( ValidateResponse( url, responseText, responseStatus, false, false ) )
    {
      // Session opened successfully
      // Play file
      var queryString = "file=" + Ajax.ajax_media_create.filename;
      Ajax.ajax_media_play.msgState = Ajax.ajax_media_create.msgState;   // Used to decide how to update message state.
      Ajax.ajax_media_play.msgId = Ajax.ajax_media_create.msgId;   // Used to update message state to Opened.
      Ajax.ajax_media_monitor.Execute('','',true);
      Ajax.ajax_media_play.Execute( queryString );
    }
    else
    {
      OnStop();
    }
  }

  // Callback for ajax_media_play
  function MediaPlayCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }

    if( ValidateResponse( url, responseText, responseStatus, true, true ) )
    {
      // Update transport controls
      OnPlay();
    }
  }

  // Callback for ajax_media_control.
  // (Note that ajax_one_way_media_control doesn't have a callback)
  // Called when transport control request returns
  function MediaControlCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }

    if( ValidateResponse( url, responseText, responseStatus, true, true ) )
    {
      switch( Ajax.ajax_media_control.command )
      {
        case "play":
          OnPlay();
          break;
        case "paus":
          OnPause();
          break;
        case "rwnd":
          OnRewind();
          break;
        case "ffwd":
          OnFastForward();
          break;
        case "stop":
          OnStop();
          break;
        default:
          break;
      }
    }
  }

  // Callback for ajax_check_session
  function CheckSessionCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }

    if( ValidateResponse( url, responseText, responseStatus, true, true ) )
    {
      if( Ajax.ajax_check_session.fn )
      {
        Ajax.ajax_check_session.fn();
      }
    }
  }

  // Callback for eg ajax_set_theme and ajax_keep_session_active (etc...)
  // Callback that handles error responses, but does nothing if request was successful.
  function GenericCallback( url, responseText, responseStatus )
  {
    if( !Ajax )
    {
      // Page no longer loaded
      return;
    }

    ValidateResponse( url, responseText, responseStatus, true, true );
  }

  // Ajax object instances
  return {
    ajax_logout                : new Transaction( 'ajax/ajax_logout.php',              LogoutCallback ),
    ajax_get_mailboxes         : new Transaction( 'ajax/ajax_get_mailboxes.php',       GetMailboxesCallback ),
    ajax_forward_messages      : new Transaction( 'ajax/ajax_forward_messages.php',    ForwardMessagesCallback ),
    ajax_move_message          : new Transaction( 'ajax/ajax_move_message.php',        RefreshingCallback ),
    ajax_delete_message        : new Transaction( 'ajax/ajax_delete_message.php',      RefreshingCallback ),
    ajax_update_message        : new Transaction( 'ajax/ajax_update_message.php',      UpdateMessageCallback ),
    ajax_get_messages          : new Transaction( 'ajax/ajax_get_messages.php',        GetMessagesCallback ),
    ajax_set_user_password     : new Transaction( 'ajax/ajax_set_user_password.php',   SetUserPasswordCallback ),
    ajax_media_create          : new Transaction( 'ajax/ajax_media_create.php',        MediaCreateCallback ),
    ajax_media_monitor         : new Transaction( 'ajax/ajax_media_monitor.php',       MediaMonitorCallback ),
    ajax_media_play            : new Transaction( 'ajax/ajax_media_play.php',          MediaPlayCallback ),
    ajax_media_control         : new Transaction( 'ajax/ajax_media_control.php',       MediaControlCallback ),
    ajax_media_dialfromextn    : new Transaction( 'ajax/ajax_media_dialfromextn.php',  GenericCallback ),
    ajax_one_way_media_control : new Transaction( 'ajax/ajax_media_control.php',       0 ),
    ajax_simple_update_message : new Transaction( 'ajax/ajax_update_message.php',      SimpleUpdateMessageCallback ),
    ajax_set_theme             : new Transaction( 'ajax/ajax_set_theme.php',           GenericCallback ),
    ajax_keep_session_active   : new Transaction( 'ajax/ajax_keep_session_active.php', GenericCallback ),
    ajax_check_session         : new Transaction( 'ajax/ajax_keep_session_active.php', CheckSessionCallback ),
    ajax_keep_session_contact  : new Transaction( 'ajax/ajax_keep_session_contact.php',GenericCallback )
  };

}();

function Activity()
{
  gLastActivityTime = Math.floor((new Date().getTime())/1000);
}

function ActivityTimeout()
{
  var now = Math.floor((new Date().getTime())/1000);
  var queryString = "idletime=" + (now - gLastActivityTime);
  ResetActivityTimer();
}

function ResetActivityTimer()
{
  if( KEEPALIVE_PERIOD )
  {
    gActivityTimer = window.setTimeout( ActivityTimeout, KEEPALIVE_PERIOD * 1000 );
  }
}

function CheckSession( fn )
{
  var now = Math.floor((new Date().getTime())/1000);
  if( now - gLastActivityTime >= KEEPALIVE_PERIOD )
  {
    var queryString = "idletime=" + (now - gLastActivityTime);
    Ajax.ajax_check_session.fn = fn;
    Ajax.ajax_check_session.Execute(queryString);
  }
  else
  {
    fn();
  }
}


//-->
