// $Revision: 25$
// $Date: 2007-08-07 2:08:19 PM$
// $Author: Joshua Isaac$
// $NoKeywords$

/******************************************************************************
  Dependencies:

    Shared/Extensions/Object.js
    Shared/Calls/Calls.js

 ******************************************************************************/

/******************************************************************************
  Constants
 ******************************************************************************/

// Message Type enum
var MSG_MESSAGE_TYPE_REGISTER_ACCOUNT  = "REGA";
var MSG_MESSAGE_TYPE_SET_CARRIER_INFO  = "SETC";
var MSG_MESSAGE_TYPE_GET_ACCOUNT_INFO  = "GETA";
var MSG_MESSAGE_TYPE_AUTHENTICATE      = "AUTH";
var MSG_MESSAGE_TYPE_FORGOT_PIN        = "FPIN";
var MSG_MESSAGE_TYPE_GET_CALLS         = "GCAL";
var MSG_MESSAGE_TYPE_VERIFY_PHONE      = "VPHO";
var MSG_MESSAGE_TYPE_SEND_SMS          = "SSMS";
var MSG_MESSAGE_TYPE_SMS_SEND_EP       = "SMSE";
var MSG_MESSAGE_TYPE_GET_CRM_CONTENT   = "CRMC";

// Widget Source enum
var MSG_WIDGET_TYPE_MAC_OS_X           = 'X';
var MSG_WIDGET_TYPE_YAHOO              = 'Y';
var MSG_WIDGET_TYPE_GOOGLE             = 'G';

var MSG_XML_HEADER                     = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";
var MSG_XML_REQUEST_ELEMENT_NAME       = "request";


/******************************************************************************
  Definitions
 ******************************************************************************/

/******************************************************************************
  MSG_RequestBase class
 ******************************************************************************/
function MSG_RequestBase( messageType,
                          source,
                          version,
                          os )
{
    this.m_type = messageType;
    this.m_src  = source;
    this.m_ver  = version;
    this.m_os   = os;
}
MSG_RequestBase.prototype =
{
    baseAsXML:function( )
    {
        var requestContent =
            this.asXMLElement( "type", this.m_type ) +
            this.asXMLElement( "src",  this.m_src  ) +
            this.asXMLElement( "ver",  this.m_ver  ) +
            this.asXMLElement( "os",   this.m_os   );

        return requestContent;
    },

    asXMLElement:function( name, value, doNotEscape )
    {
        return UTILS.asXmlString( name, value, doNotEscape );
    }
};


/******************************************************************************
  MSG_RegisterAccountRequest class
 ******************************************************************************/
function MSG_RegisterAccountRequest( source,
                                     version,
                                     os,
                                     phoneNumber,
                                     pin,
                                     emailAddress,
                                     custName,
                                     referralSource )
{
    EXT_extend( this, new MSG_RequestBase( MSG_MESSAGE_TYPE_REGISTER_ACCOUNT,
                                           source,
                                           version,
                                           os ) );

    this.m_phone    = phoneNumber;
    this.m_pin      = pin;

    this.m_custName = custName;
    if ( this.m_custName === null || this.m_custName === undefined )
    {
        this.m_custName = "";
    }

    this.m_referralSource = referralSource;
    if ( this.m_referralSource === null || this.m_referralSource === undefined )
    {
        this.m_referralSource = "";
    }

    this.m_email = emailAddress;
    if ( this.m_email === null || this.m_email === undefined )
    {
        this.m_email = "";
    }

}
MSG_RegisterAccountRequest.prototype =
{
    asXML:function( )
    {
        var requestContent =
            this.baseAsXML( )                                    +
            this.asXMLElement( "phone", this.m_phone )           +
            this.asXMLElement( "pin",   this.m_pin   );
        
        if ( this.m_custName.length != 0 )
        {   
            requestContent += this.asXMLElement( "custName", this.m_custName );
        }
        
        if ( this.m_email.length != 0 )
        { 
            requestContent += this.asXMLElement( "email", this.m_email );
        }

        if ( this.m_referralSource.length != 0 )
        { 
            requestContent += this.asXMLElement( "referralSource", this.m_referralSource );
        }

        // Do not escape the message body
        return MSG_XML_HEADER + this.asXMLElement( MSG_XML_REQUEST_ELEMENT_NAME, requestContent, true );
    }
};


/******************************************************************************
  MSG_SetCarrierInfoRequest class
 ******************************************************************************/
function MSG_SetCarrierInfoRequest( source,
                                    version,
                                    os,
                                    account,
                                    uString,
                                    carrierId )
{
    EXT_extend( this, new MSG_RequestBase( MSG_MESSAGE_TYPE_SET_CARRIER_INFO,
                                           source,
                                           version,
                                           os ) );

    this.m_account   = account;
    this.m_uString   = uString;
    this.m_carrierId = carrierId;
}
MSG_SetCarrierInfoRequest.prototype =
{
    asXML:function( )
    {
        var requestContent =
            this.baseAsXML( ) +
            this.asXMLElement( "account",   this.m_account   ) +
            this.asXMLElement( "uString",   this.m_uString   ) +
            this.asXMLElement( "carrierId", this.m_carrierId );

        // Do not escape the message body
        return MSG_XML_HEADER + this.asXMLElement( MSG_XML_REQUEST_ELEMENT_NAME, requestContent, true );
    }
};


/******************************************************************************
  MSG_VerifyPhoneRequest class
 ******************************************************************************/
function MSG_VerifyPhoneRequest( source,
                                 version,
                                 os,
                                 account,
                                 uString,
                                 verificationCode,
                                 phoneCC,
                                 phoneNN )
{
    EXT_extend( this, new MSG_RequestBase( MSG_MESSAGE_TYPE_VERIFY_PHONE,
                                           source,
                                           version,
                                           os ) );

    this.m_account          = account;
    this.m_uString          = uString;
    this.m_verificationCode = verificationCode;
    this.m_phoneCC          = phoneCC;
    this.m_phoneNN          = phoneNN;
}
MSG_VerifyPhoneRequest.prototype =
{
    asXML:function( )
    {
        var requestContent =
            this.baseAsXML( ) +
            this.asXMLElement( "account",          this.m_account   ) +
            this.asXMLElement( "uString",          this.m_uString   ) +
            this.asXMLElement( "verificationCode", this.m_verificationCode ) +
            this.asXMLElement( "phoneCC",          this.m_phoneCC ) +
            this.asXMLElement( "phoneNN",          this.m_phoneNN );

        // Do not escape the message body
        return MSG_XML_HEADER + this.asXMLElement( MSG_XML_REQUEST_ELEMENT_NAME, requestContent, true );
    }
};


/******************************************************************************
  MSG_GetAccountInfoRequest class
 ******************************************************************************/
function MSG_GetAccountInfoRequest( source,
                                    version,
                                    os,
                                    accountNumber,
                                    uString )
{
    EXT_extend( this, new MSG_RequestBase( MSG_MESSAGE_TYPE_GET_ACCOUNT_INFO,
                                           source,
                                           version,
                                           os ) );

    this.m_account = accountNumber;
    this.m_uString = uString;
}
MSG_GetAccountInfoRequest.prototype =
{
    asXML:function( )
    {
        var requestContent =
            this.baseAsXML( ) +
            this.asXMLElement( "account",   this.m_account ) +
            this.asXMLElement( "uString",   this.m_uString );

        // Do not escape the message body
        return MSG_XML_HEADER + this.asXMLElement( MSG_XML_REQUEST_ELEMENT_NAME, requestContent, true );
    }
};


/******************************************************************************
  MSG_AuthenticateRequest class
 ******************************************************************************/
function MSG_AuthenticateRequest( source,
                                  version,
                                  os,
                                  phoneNumber,
                                  pin )
{
    EXT_extend( this, new MSG_RequestBase( MSG_MESSAGE_TYPE_AUTHENTICATE,
                                           source,
                                           version,
                                           os ) );

    this.m_phone = phoneNumber;
    this.m_pin   = pin;
}
MSG_AuthenticateRequest.prototype =
{
    asXML:function( )
    {
        var requestContent =
            this.baseAsXML( ) +
            this.asXMLElement( "phone",   this.m_phone ) +
            this.asXMLElement( "pin",     this.m_pin   );

        // Do not escape the message body
        return MSG_XML_HEADER + this.asXMLElement( MSG_XML_REQUEST_ELEMENT_NAME, requestContent, true );
    }
};


/******************************************************************************
  MSG_ForgotPinRequest class
 ******************************************************************************/
function MSG_ForgotPinRequest( source,
                               version,
                               os,
                               phoneNumber )
{
    EXT_extend( this, new MSG_RequestBase( MSG_MESSAGE_TYPE_FORGOT_PIN,
                                           source,
                                           version,
                                           os ) );

    this.m_phone = phoneNumber;
}
MSG_ForgotPinRequest.prototype =
{
    asXML:function( )
    {
        var requestContent =
            this.baseAsXML( ) +
            this.asXMLElement( "phone", this.m_phone );

        // Do not escape the message body
        return MSG_XML_HEADER + this.asXMLElement( MSG_XML_REQUEST_ELEMENT_NAME, requestContent, true );
    }
};


/******************************************************************************
  MSG_GetCallsRequest class
 ******************************************************************************/
function MSG_GetCallsRequest( source,
                              version,
                              os,
                              accountNumber,
                              uString,
                              syncLevel,
                              callUpdateList,
                              maxCalls )
{
    EXT_extend( this, new MSG_RequestBase( MSG_MESSAGE_TYPE_GET_CALLS,
                                           source,
                                           version,
                                           os ) );

    this.m_account     = accountNumber;
    this.m_uString     = uString;
    this.m_syncLevel   = syncLevel;
    this.m_callUpdates = callUpdateList;
    this.m_maxCalls    = maxCalls;
}
MSG_GetCallsRequest.prototype =
{
    asXML:function( )
    {
        var requestContent =
            this.baseAsXML( ) +
            this.asXMLElement( "account",   this.m_account   ) +
            this.asXMLElement( "uString",   this.m_uString   ) +
            this.asXMLElement( "syncLevel", this.m_syncLevel ) +
            this.m_callUpdates.asXML( ) +
            this.asXMLElement( "maxCalls",  this.m_maxCalls  );

        // Do not escape the message body
        return MSG_XML_HEADER + this.asXMLElement( MSG_XML_REQUEST_ELEMENT_NAME, requestContent, true );
    }
};


/******************************************************************************
  MSG_SendSMSRequest class
 ******************************************************************************/
function MSG_SendSMSRequest( source,
                             version,
                             os,
                             accountNumber,
                             uString,
                             sendToPhoneNumber,
                             sendToCarrierID,
                             sendFromPreference,
                             message )
{
    EXT_extend( this, new MSG_RequestBase( MSG_MESSAGE_TYPE_SEND_SMS,
                                           source,
                                           version,
                                           os ) );

    this.m_account            = accountNumber;
    this.m_uString            = uString;
    this.m_sendToPhoneNumber  = sendToPhoneNumber;
    this.m_sendToCarrierID    = sendToCarrierID;
    this.m_sendFromPreference = sendFromPreference;
    this.m_message            = message;
}
MSG_SendSMSRequest.prototype =
{
    asXML:function( )
    {
        var requestContent =
            this.baseAsXML( ) +
            this.asXMLElement( "account",            this.m_account   ) +
            this.asXMLElement( "uString",            this.m_uString   ) +
            this.asXMLElement( "sendToPhoneNumber",  this.m_sendToPhoneNumber ) +
            this.asXMLElement( "sendToCarrierID",    this.m_sendToCarrierID ) +
            this.asXMLElement( "sendFromPreference", this.m_sendFromPreference ) +
            this.asXMLElement( "message",            this.m_message  );

        // Do not escape the message body
        return MSG_XML_HEADER + this.asXMLElement( MSG_XML_REQUEST_ELEMENT_NAME, requestContent, true );
    }
};

/******************************************************************************
  MSG_GetSMSSendPopRequest class
 ******************************************************************************/
function MSG_GetSMSSendPopRequest( source,
                                   version,
                                   os,
                                   accountNumber,
                                   uString )
{
    EXT_extend( this, new MSG_RequestBase( MSG_MESSAGE_TYPE_SMS_SEND_EP,
                                           source,
                                           version,
                                           os ) );

    this.m_account = accountNumber;
    this.m_uString = uString;
}
MSG_GetSMSSendPopRequest.prototype =
{
    asXML:function( )
    {
        var requestContent =
            this.baseAsXML( ) +
            this.asXMLElement( "account", this.m_account ) +
            this.asXMLElement( "uString", this.m_uString );

        // Do not escape the message body
        return MSG_XML_HEADER + this.asXMLElement( MSG_XML_REQUEST_ELEMENT_NAME, requestContent, true );
    }
};

/******************************************************************************
  MSG_GetCRMContentRequest class
 ******************************************************************************/
function MSG_GetCRMContentRequest( source,
                                   version,
                                   os,
                                   accountNumber,
                                   uString )
{
    EXT_extend( this, new MSG_RequestBase( MSG_MESSAGE_TYPE_GET_CRM_CONTENT,
                                           source,
                                           version,
                                           os ) );

    this.m_account = accountNumber;
    this.m_uString = uString;
}
MSG_GetCRMContentRequest.prototype =
{
    asXML:function( )
    {
        var requestContent =
            this.baseAsXML( ) +
            this.asXMLElement( "account", this.m_account ) +
            this.asXMLElement( "uString", this.m_uString );

        // Do not escape the message body
        return MSG_XML_HEADER + this.asXMLElement( MSG_XML_REQUEST_ELEMENT_NAME, requestContent, true );
    }
};
