This topic has not yet been rated - Rate this topic

Sample: Debug properties of Outlook items

apps for Office

This topic describes a set of 2 sample Debug mail apps that allow developers to conveniently display built-in item properties of a selected message or appointment, depending on the chosen permission level.

Last modified: February 17, 2014

Applies to: Exchange Online | Exchange Server 2013 | Exchange Server 2013 SP1 | Outlook 2013 | Outlook 2013 SP1 | Outlook Web App | OWA for Devices

   Office.js: v1.0

   Apps for Office manifests schema: v1.0

The JavaScript API for Office supports accessing the object and members of the item that is currently selected in the host application and on which a mail app is activated. The access to such members is determined by the permission requested by the mail app. This topic shows a set of 2 Debug mail apps, each of which displays the properties of the selected message or appointment that are accessible to the mail app based on the requested permission.

There are 3 tiers of permissions for mail apps that build on top of one another: restricted permission is the basic level, read item permission includes restricted permission, and read/write mailbox permission includes read item and restricted permissions. Mail apps with at least the read item permission can access user profile properties and all item-level properties that are supported by the JavaScript API for Office, and mail apps with restricted permission can access a subset of the item-level properties. Table 1 lists the UserProfile and item-level properties that are accessible by each permission level. Note that mail apps with only restricted permission are also blocked from a few other members in the JavaScript API for Office. For a complete list of such blocked properties and methods, see Using the permission model for mail apps in Outlook.

Table 1. User profile properties and item properties accessible per permission level

Parent object

Property

Restricted permission

Read item or Read/write mailbox permission

UserProfile

displayName

No

Yes

emailAddress

No

Yes

timeZone

No

Yes

Item

dateTimeCreated

Yes

Yes

dateTimeModified

Yes

Yes

itemClass

Yes

Yes

itemId

Yes

Yes

itemType

Yes

Yes

Message

cc

No

Yes

conversationId

Yes

Yes

from

No

Yes

internetMessageId

Yes

Yes

normalizedSubject

Yes

Yes

sender

No

Yes

subject

Yes

Yes

to

No

Yes

Appointment

end

Yes

Yes

location

Yes

Yes

normalizedSubject

Yes

Yes

optionalAttendees

No

Yes

organizer

No

Yes

requiredAttendees

No

Yes

resources

No

Yes

start

Yes

Yes

subject

Yes

Yes

EmailAddressDetails

displayName

No

Yes

emailAddress

No

Yes

Because read item and read/write mailbox permissions provide the same access to UserProfile and item properties, for the purpose of debugging these properties, a set of 2 mail apps is sufficient: the Debug (Restricted) mail app requests restricted permission, and the Debug (Other) mail app requests read item permission. You would install both Debug mail apps.

When you are testing your own custom mail app on a selected item, you can use one of the two Debug mail apps to display property values of that item, by first selecting that item and then choosing the Debug mail app that corresponds to the same level of permission as your custom mail app. Table 2 summarizes the choice.

Table 2. Choosing a Debug mail app

Name of Debug mail app

Permission specified in manifest

Use

Debug (Restricted)

<Permissions>Restricted</Permissions>

Choose this Debug mail app if the mail app you’re testing specifies restricted permission.

Debug (Other)

<Permissions>ReadItem</Permissions>

Choose this Debug mail app if the mail app you’re testing specifies read item or read/write mailbox permission.

For example, if you are testing a MyApp (Restricted) mail app that requires restricted permission on a particular email message, you can choose the Debug (Restricted) mail app to view the accessible item properties for that email message. Figure 1 shows this mail app displaying the built-in properties for the selected email message titled "Hello", which are accessible under restricted permission.

Figure 1. The Debug mail app displays the item properties for a selected message that are accessible under restricted permission

Standard properties mail app displaying item properties available for the restricted permission.
Note Note

The Debug mail app allows you to debug the properties of only the item on which this mail app is currently activated. If your mail app is not activated on an item as you expect, see Troubleshooting mail apps activation.

The main difference in the manifests of the 2 Debug mail apps is the requested permission: one specifying Restricted, and the other ReadItem, as shown in Table 2. Other differences between the 2 manifests are the Id, DisplayName and Description elements that differentiate one mail app from another.

The remaining of this section highlights the typical elements in a manifest for a mail app. Every manifest has the OfficeApp element as the root element that encloses various child elements of the MailApp complex type in a sequential order. Refer to Appendix A for a complete listing of the 2 manifests.

  • The type of the app—The OfficeApp element specifies that this app is of the MailApp complex type:

    <OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="MailApp">
    
  • The identifier of the app—The value of the Id element is a Universally Unique Identifier (UUID) for each . The following is the UUID for the Debug (Restricted) mail app:

    <Id>67478bb0-0072-1989-a21f-0800200c9a66</Id>
    
  • The label on the app button—The DisplayName element differentiates the 2 mail apps from one another in the app bar of the host application, for example:

    <DisplayName DefaultValue="Debug (Restricted)"/>
    
  • The app description—The Description element differentiates the mail apps in the Exchange Admin Center, for example:

    <Description DefaultValue=
      "Display item properties available for restricted permission."/>
    
  • The capability that each of these mail apps works with—Each mail app includes one Capability element and requests the Mailbox capability. An application that supports the Mailbox capability can become a host application for this app.

    <Capabilities>
      <Capability Name="Mailbox"/>
    </Capabilities>
    
  • The form factor and location of the HTML file—Because this set of mail apps is primarily intended for debugging which is typically carried out on a desktop computer, both manifests specify only the DesktopSettings element. This element has 2 child elements:

    • The RequestedHeight element specifies the ideal height of the app pane appropriate for that desktop form factor.

    • The SourceLocation element specifies the HTML source file that specifies the table to display the applicable properties.

    The following example is from the Debug (Restricted) mail app and specifies the location of the HTML file itemPropsRS.html.

    <DesktopSettings>
        <!-- Change the following line to specify the web server -->
        <!-- that hosts the HTML file. -->
        <SourceLocation DefaultValue=
          "https://webserver/ItemPropertiesMailAppRestricted/itemPropsRS.html"/>
        <RequestedHeight>450</RequestedHeight>
    </DesktopSettings>
    
  • The requested permission—As described earlier in this section, each of the 2 Debug mail apps specifies a different level of permission supported for mail apps. The following example is from the Debug (Restricted) mail app which requests the restricted permission.

    <Permissions>Restricted</Permissions>
    
  • The activation rule—To support debugging any message (including email messages, meeting requests, responses, and cancellations) and appointment items, the manifest includes a rule collection of two ItemIs rules that would activate the set of mail apps for either of these types. The activation rule is the same for both Debug mail apps.

    <Rule xsi:type="RuleCollection" Mode="Or">
      <Rule xsi:type="ItemIs" ItemType="Message"/><Rule xsi:type="ItemIs" ItemType="Appointment"/>
    </Rule>
    

Each of the 2 HTML files specifies the user interface for displaying property values accessible under the corresponding level of permissions. This section highlights a few areas of interest in implementing the HTML code.

  • A document display mode for the highest mode available on the client computer to ensure a quality experience — Because the ideal user experience is to use the latest Internet Explorer components on the client computer that are at least Internet Explorer 9, place the following document compatibility meta element as a child element of the head element in your HTML file, before all other elements except for the title and other meta elements. The following example is from the Debug (Restricted) mail app.

    <!DOCTYPE html>
    <html>
        <head>
            <title>Item Properties - Restricted</title>
            <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    
  • A style sheet, itemPropsRS.css or itemPropsRD.css, that specifies the layout of the output. See Appendix B: Style sheet for a listing of the style sheet. The following example is from the Debug (Restricted) mail app.

    <link rel="stylesheet" type="text/css" media="all" 
        href="css/itemPropsRS.css" />
    
  • The location of the JavaScript library files that the corresponding mail app uses. The following example includes the JavaScript file, itemPropsRS.js, for the Debug (Restricted) mail app:

    <script type="text/javascript" 
        src="js/jquery/jquery-1.7.2.min.js"></script>
    <script type="text/javascript"
        src="js/office/MicrosoftAjax.js"></script>
    <!-- Use the CDN reference to Office.js when deploying your app. -->
    <script type="text/javascript" 
    src="https://appsforoffice.microsoft.com/lib/1.0/hosted/office.js"></script>
    <script type="text/javascript"
        src="js/itemPropsRS.js"></script>
    
  • Initial notification that the apps for Office runtime environment has not been loaded:

    <body>
        <div id="api-ready">API NOT READY</div>
    
  • The table that displays property values, which is the bulk of the HTML file. The following example is an abbreviated listing of the table that displays properties accessible under the restricted permission.

    <div id="container">
        <table cellpadding="0" cellspacing="0">
            <tr>
                <td class="propName firstRow">subject</td>
                <td id="subject" class="propVal firstRow"></td>
            </tr>
            <tr>
                 <td class="propName">normalizedSubject</td>
                 <td id="normalizedSubject" class="propVal"></td>
            </tr>
            <!--Refer to appendix C for a complete listing of the 
             table.-->
            <tr>
                  <td class="propName">location</td>
                  <td id="location" class="propVal"></td>
            </tr>
        </table>
    </div>
    

See Appendix C: HTML files for a complete listing of the 2 HTML files, itemPropsRS.html for the Debug (Restricted) mail app, and itemPropsRD.html for the Debug (Other) mail app.

This section first describes the overall structure of the JavaScript files of the 2 Debug mail apps, and drills down to a few particular points of interest about displaying properties. See Appendix D: JavaScript files for a complete listing of the 2 JavaScript files, itemPropsRS.js for the Debug (Restricted) mail app, and itemPropsRD.js for the Debug (Other) mail app.

Overall design

This section describes the overall design of the JavaScript file for this set of mail apps. Even though the Debug (Restricted) mail app displays only a subset of the properties of Debug (Other), their overall JavaScript implementation follows the same principles.

  1. First, the JavaScript code declares a namespace Olk.ItemProps and defines an object Ext in that namespace. It defines Ext as a named function ItemPropsExt which takes a Mailbox object appOm as input parameter. The Mailbox object provides the mail app access to the object model, in order to determine and display the values of the properties that are available on the selected item. The advantage of creating a namespace and defining objects and functions in that namespace is to reduce the number of functions added to the global scope in our applications.

    Type.registerNamespace('Olk.ItemProps');
    
    // This function determines and displays
    // properties values that are available 
    // on the selected item.
    Olk.ItemProps.Ext = function ItemPropsExt(appOm)
    {…}
    
    
  2. The execution starts with calling the init function:

    Olk.ItemProps.Ext.init();
    
  3. init is the gatekeeper function that defines the event handler for the Office.initialize event. This event handler instantiates an instance of the Ext object. It also makes sure both the runtime environment and the DOM have finished loading before calling the start function which kick-starts the rest of the code specific to this mail app.

    Olk.ItemProps.Ext.init = function InitExt()
    {
        // Event handler for the Office.initialize event
        // to make sure the runtime environment is ready.
        Office.initialize = function ()
        {
            // Instantiates an instance of the object Ext.
            var myExt = 
                new Olk.ItemProps.Ext(Office.context.mailbox);
    
            // Checks for the DOM to load.
            $(document).ready (function() {
                // Both runtime environment and
                // DOM are ready, start mail app code.
                myExt.start();
            });
        }
    }
    
  4. Up till this point, steps 1 through 3 apply to both Debug (Restricted) and Debug (Other) mail apps. The start function is defined as part of the Ext object. The start function is where the 2 Debug mail apps differ – it acts as a dispatcher that calls other functions to display accessible properties. The following code shows the start function for the Debug (Other) mail app.

    // This function determines and displays
    // properties values that are available 
    // on the selected item.
    Olk.ItemProps.Ext = function ItemPropsExt(appOm)
    {// Bulk of the code that define functions
    // to display properties.
    
        this.start = function()
        {
            _showAPIReady();
    
            // The following properties are available on
            // appropriate items for all mail apps 
            // independent of permission.
            _getSubject();
            _getNormalizedSubject();
            _getItemClass();
            _getItemType();
            _getDateTimeCreated();
            _getDateTimeModified();
            _getItemId();
            _getConversationId();
            _getInternetMessageId();
            _getStart();
            _getEnd();
            _getLocation();
            // The following properties are available
            // only if the mail app has requested read item
            // or read-write mailbox permission.
            _getUserProfile();
            _getFrom();
            _getSender();
            _getTo();
            _getCc();
            _getOrganizer();
            _getRequiredAttendees();
            _getOptionalAttendees();
            _getResources();
        }
    }
    
    

Specific points of interest

For each of the 2 Debug mail apps, the JavaScript code accesses and displays properties that are accessible under the corresponding permission level, as listed in Table 1. The following lists the points of interest:

  • The properties of UserProfile are accessible under the read item and read/write mailbox permissions independent of item type. They include displayName, emailAddress, and timeZone.

  • The item properties that are available for all permission levels and item types are as follows: dateTimeCreated, dateTimeModified, itemClass, itemId, itemType, subject, and normalizedSubject.

  • The item properties that are accessible only under read item and read/write mailbox permissions are as follows: Message.cc, Message.from, Message.sender, Message.to, Appointment.optionalAttendees, Appointment.organizer, Appointment.requiredAttendees, Appointment.resources and the child properties, such as appointmentResponse, displayName and emailAddress, of the EmailAddressDetails object returned by each of these properties. In particular, because the responses of attendees and resources are only accessible to the appointment organizer, the JavaScript code uses the following _isOrganizer function to verify if the current user is the organizer of an appointment, before enumerating responses:

    // Check if the current user is the organizer of a meeting.
    var _isOrganizer = function()
    {
        if ( (_item.itemType == 
            Office.MailboxEnums.ItemType.Appointment) &&
            (appOm.userProfile.emailAddress == 
                _item.organizer.emailAddress) )
        {
            return true;
        }
        
        return false;
    }
    
  • The item properties that are available on message items (email items, meeting requests, responses, and cancellations) are as follows: conversationId, internetMessageId, from, sender, and to. In particular, from and sender differ if a message is sent by a delegate, in which case the from property represents the delegator, and the sender property represents the delegate.

  • There are item properties that are available on calendar items (including meeting requests, responses, cancellations, and appointments): start, end, and location. In particular, the _isCalendarItem function uses the message class of the selected item to verify whether the item is a meeting request, response, or cancellation. Such items share the base message class of IPM.Schedule. For more information about message classes, see Item Types and Message Classes.

    // Check if an item is an appointment or meeting request.
    var _isCalendarItem = function()
    {
        if ( (_item.itemType == 
            Office.MailboxEnums.ItemType.Appointment) ||
            (_item.itemClass.indexOf("IPM.Schedule") != -1) )
        {
            return true;
        }
            
        return false;
    }
    

This mail app helps you debug properties of a selected item that are built-in as part of the JavaScript API for Office. The apps for Office platform supports other features such as well-known entities, roaming settings, and custom properties of items that mail apps can activate on. How to: Extract entity strings from an Outlook item shows another example mail app to debug well-known entities in a selected item. You can refer to the following topics and extend this mail app to debug roaming settings and custom properties as well.

This section includes listings for the 2 manifest files, itemPropsRS.xml for restricted permission, and itemPropsRD.xml for read item permission.

The following lists itemPropsRS.xml for the Debug (Restricted) mail app which requests restricted permission.

<?xml version="1.0" encoding="utf-8"?>
<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="MailApp">
    <Id>67478bb0-0072-1983-a21f-0800200c9a66</Id>
    <Version>1.0</Version>
    <ProviderName>Microsoft</ProviderName>
    <DefaultLocale>en-US</DefaultLocale>
    <DisplayName DefaultValue="Debug (Restricted)"/>
    <Description DefaultValue=
        "Display item properties values available for restricted permission."/>
    <Capabilities>
        <Capability Name="Mailbox"/>
    </Capabilities>
    <DesktopSettings>
        <!-- Change the following line to specify the web server -->
        <!-- that hosts the HTML file. -->
        <SourceLocation DefaultValue=
            "https://webserver/ItemPropertiesMailAppRestricted/itemPropsRS.html"/>
        <RequestedHeight>450</RequestedHeight>
    </DesktopSettings>
    <Permissions>Restricted</Permissions>
    <Rule xsi:type="RuleCollection" Mode="Or">
        <Rule xsi:type="ItemIs" ItemType="Message"/>
        <Rule xsi:type="ItemIs" ItemType="Appointment"/>
    </Rule>
    <DisableEntityHighlighting>false</DisableEntityHighlighting>
</OfficeApp>

The following lists the manifest for the Debug (Other) mail app which requests read item permission.

<?xml version="1.0" encoding="utf-8"?>
<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="MailApp">
    <Id>68dc34eb-ed4f-1989-a36b-ad8cee3e146f</Id>
    <Version>1.0</Version>
    <ProviderName>Microsoft</ProviderName>
    <DefaultLocale>en-US</DefaultLocale>
    <DisplayName DefaultValue="Debug (Other)"/>
    <Description DefaultValue=
        "Display item properties values available for read item or read-write mailbox permission."/>
    <Capabilities>
        <Capability Name="Mailbox"/>
    </Capabilities>
    <DesktopSettings>
        <!-- Change the following line to specify the web server -->
        <!-- that hosts the HTML file. -->
        <SourceLocation DefaultValue=
            "https://webserver/ItemPropertiesMailAppOtherPerms/itemPropsRD.html"/>
        <RequestedHeight>450</RequestedHeight>
    </DesktopSettings>
    <Permissions>ReadItem</Permissions>
    <Rule xsi:type="RuleCollection" Mode="Or">
        <Rule xsi:type="ItemIs" ItemType="Message"/>
        <Rule xsi:type="ItemIs" ItemType="Appointment"/>
    </Rule>
    <DisableEntityHighlighting>false</DisableEntityHighlighting>
</OfficeApp>

This section includes a listing for the 2 optional style sheet files, itemPropsRS.css for the Debug (Restricted) mail app, and itemPropsRD.css for the Debug (Other) mail app. Other than the file name, the style sheets are the same, and hence this section includes only one listing.

/*
 * File     : itemPropsRS.css
 * Author   : Microsoft
 */

*
{
    margin: 0px;
    padding: 0px;
    font-family: Arial, Sans-serif;
}
html 
{
    height: 100%;
    scrollbar-base-color: #ffffff;
    scrollbar-arrow-color: #ababab; 
    scrollbar-lightshadow-color: #ababab; 
    scrollbar-highlight-color: #ababab; 
    scrollbar-darkshadow-color: #ffffff; 
    scrollbar-track-color: #ffffff;
}
body
{
    color: #000000;
    background: #ffffff;
}
div#apiReady
{
    text-align: center;
    font-weight: bold;
}
div#container
{
    height: 100%;
    width: 715px;
    padding: 2px;
    margin: 0px auto;
}
div#container table
{
    table-layout: fixed;
    width: 700px;
}
div#container td
{
    border-bottom: 1px solid #ffffff;
    border-left: 1px solid #ffffff;
}
td.propName
{
    width: 200px;
    padding: 0px 5px 0px 0px;
}
td.propVal
{
    width: 300px;
    word-wrap: break-word;
    padding: 0px 0px 0px 5px;
    color: #ffff00;
    font-weight: bold;
    border-right: 1px solid #ffffff;
}
td.firstRow
{
    border-top: 1px solid #ffffff;
}

This section includes listings for the 2 HTML files, itemPropsRS.html for restricted permission, and itemPropsRD.html for read item permission.

The following is a listing of itemPropsRS.html which specifies the corresponding JavaScript file and table to display properties accessible to the Debug (Restricted) mail app that has restricted permission.

<!DOCTYPE html>
<html>
    <head>
        <title>Item Properties - Restricted</title>
        <meta http-equiv="X-UA-Compatible" content="IE=Edge">
        <link rel="stylesheet" type="text/css" media="all"
            href="css/itemPropsRS.css" />
        <script type="text/javascript" 
            src="js/jquery/jquery-1.7.2.min.js"></script>
        <script type="text/javascript"
            src="js/office/MicrosoftAjax.js"></script>    
        <!-- Use the CDN reference to Office.js when deploying your app. -->
        <script type="text/javascript" 
            src="https://appsforoffice.microsoft.com/lib/1.0/hosted/office.js"></script>
        <script type="text/javascript"
            src="js/itemPropsRS.js"></script>
    </head>
    <body>
        <div id="apiReady">API NOT READY</div>
        <div id="container">
            <table cellpadding="0" cellspacing="0">
                <tr>
                    <td class="propName firstRow">subject</td>
                    <td id="subject" class="propVal firstRow"></td>
                </tr>
                <tr>
                    <td class="propName">normalizedSubject</td>
                    <td id="normalizedSubject" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">itemClass</td>
                    <td id="itemClass" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">itemType</td>
                    <td id="itemType" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">dateTimeCreated</td>
                    <td id="dateTimeCreated" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">dateTimeModified</td>
                    <td id="dateTimeModified" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">itemId (EWS ID)</td>
                    <td id="itemId" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">conversationId</td>
                    <td id="conversationId" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">internetMessageId</td>
                    <td id="internetMessageId" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">start</td>
                    <td id="start" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">end</td>
                    <td id="end" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">location</td>
                    <td id="location" class="propVal"></td>
                </tr>
            </table>
        </div>
    </body>
</html>

The following is a listing of itemPropsRD.html which specifies the corresponding JavaScript file and table to display properties accessible to the Debug (Other) mail app that has read item permission.

<!DOCTYPE html>
<html>
    <head>
        <title>Item Properties - ReadItem</title>
        <meta http-equiv="X-UA-Compatible" content="IE=Edge">
        <link rel="stylesheet" type="text/css" media="all"
            href="css/itemPropsRD.css" />
        <script type="text/javascript" 
            src="js/jquery/jquery-1.7.2.min.js"></script>
        <script type="text/javascript"
            src="js/office/MicrosoftAjax.js"></script>
        <!-- Use the CDN reference to Office.js when deploying your app. -->
        <script type="text/javascript" 
            src="https://appsforoffice.microsoft.com/lib/1.0/hosted/office.js"></script>
        <script type="text/javascript"
            src="js/itemPropsRD.js"></script>
    </head>
    <body>
        <div id="apiReady">API NOT READY</div>
        <div id="container">
            <table cellpadding="0" cellspacing="0">
                <tr>
                    <td class="propName firstRow">userProfile</td>
                    <td id="userProfile" class="propVal firstRow"></td>
                </tr>
                <tr>
                    <td class="propName">subject</td>
                    <td id="subject" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">normalizedSubject</td>
                    <td id="normalizedSubject" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">itemClass</td>
                    <td id="itemClass" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">itemType</td>
                    <td id="itemType" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">dateTimeCreated</td>
                    <td id="dateTimeCreated" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">dateTimeModified</td>
                    <td id="dateTimeModified" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">itemId (EWS ID)</td>
                    <td id="itemId" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">conversationId</td>
                    <td id="conversationId" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">internetMessageId</td>
                    <td id="internetMessageId" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">start</td>
                    <td id="start" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">end</td>
                    <td id="end" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">location</td>
                    <td id="location" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">from</td>
                    <td id="from" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">sender</td>
                    <td id="sender" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">to</td>
                    <td id="to" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">cc</td>
                    <td id="cc" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">organizer</td>
                    <td id="organizer" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">requiredAttendees</td>
                    <td id="requiredAttendees" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">optionalAttendees</td>
                    <td id="optionalAttendees" class="propVal"></td>
                </tr>
                <tr>
                    <td class="propName">resources</td>
                    <td id="resources" class="propVal"></td>
                </tr>
            </table>
        </div>
    </body>
</html>

This section includes listings for the 2 JavaScript files, itemPropsRS.js for restricted permission, and itemPropsRD.js for read item permission.

The following is a listing of itemPropsRS.js which displays properties accessible to the Debug (Restricted) mail app that has restricted permission.

/*
 * File     : itemPropsRS.js
 * Author   : Microsoft
 */

Type.registerNamespace('Olk.ItemProps');

// This function determines and displays
// properties values that are available 
// on the selected item. This function
// assumes that the mail app has restricted
// permission.
Olk.ItemProps.Ext = function ItemPropsExt(appOm)
{
    var _item = appOm.item;
    
    var _msgOnly = 
        "Only available on the MESSAGE object.";
    var _apptOnly = 
        "Only available on the APPOINTMENT object.";
    var _calOnly = 
        "Only available on appointment or meeting request items.";
    
    // Check if an item is an appointment or meeting request.
    var _isCalendarItem = function()
    {
        if ( (_item.itemType == Office.MailboxEnums.ItemType.Appointment) ||
             (_item.itemClass.indexOf("IPM.Schedule") != -1) )
        {
            return true;
        }
        
        return false;
    }
    
    var _showAPIReady = function()
    {
        $("div#apiReady").text("API IS READY");
        $("body").css("background-color", "#298ed6");
        $("body").css("color", "#ffffff");
    }

    // This property is available on the Message or
    // Appointment object.    
    var _getSubject = function()
    {
        $("td#subject").text(_item.subject);
    }
    
    // This property is available on the Message or
    // Appointment object.
    var _getNormalizedSubject = function()
    {
        $("td#normalizedSubject").text(_item.normalizedSubject);
    }
    
    // This property is available on the Message or
    // Appointment object.
    var _getItemClass = function()
    {
        $("td#itemClass").text(_item.itemClass);
    }
    
    // This property is available on the Message or
    // Appointment object.
    var _getItemType = function()
    {
        $("td#itemType").text(_item.itemType);
    }
    
    // This property is available on the Message or
    // Appointment object.
    // It represents a JavaScript Date object.
    var _getDateTimeCreated = function()
    {
        var date = _item.dateTimeCreated;
        
        // Show how to extract the different components of 
        // a date-time value.
        var info = "";
        info += "Full Date : " + date.toString() + "<br/>";
        info += "Full Year : " + date.getFullYear() + "<br/>";
        // date.getMonth returns 0-based values, so increment by 1.
        info += "Month : " + (date.getMonth()+1) + "<br/>";
        info += "Day of Month : " + date.getDate() + "<br/>";
        info += "Day of Week : " + date.getDay() + "<br/>";
        info += "Hours : " + date.getHours() + "<br/>";
        info += "Minutes : " + date.getMinutes() + "<br/>";
        info += "Seconds : " + date.getSeconds() + "<br/>";
        
        $("td#dateTimeCreated").html(info);
    }
    
    // This property is available on the Message or
    // Appointment object.
    // It represents a JavaScript Date object.
    var _getDateTimeModified = function()
    {
        var date = _item.dateTimeModified;
        
        // Show how to extract the different components of 
        // a date-time value.
        var info = "";
        info += "Full Date : " + date.toString() + "<br/>";
        info += "Full Year : " + date.getFullYear() + "<br/>";
        // date.getMonth returns 0-based values, so increment by 1.
        info += "Month : " + (date.getMonth()+1) + "<br/>";
        info += "Day of Month : " + date.getDate() + "<br/>";
        info += "Day of Week : " + date.getDay() + "<br/>";
        info += "Hours : " + date.getHours() + "<br/>";
        info += "Minutes : " + date.getMinutes() + "<br/>";
        info += "Seconds : " + date.getSeconds() + "<br/>";
        
        $("td#dateTimeModified").html(info);
    }
    
    // This property is available on the Message or
    // Appointment object.
    var _getItemId = function()
    {
        $("td#itemId").text(_item.itemId);
    }
    
    // This property is available on only the Message object.
    var _getConversationId = function()
    {
        if (_item.itemType == Office.MailboxEnums.ItemType.Message)
        {
            $("td#conversationId").text(_item.conversationId);
        }
        else
        {
            $("td#conversationId").text(_msgOnly);
        }
    }
    
    // This property is available on only the Message object.
    var _getInternetMessageId = function()
    {
        if (_item.itemType == Office.MailboxEnums.ItemType.Message)
        {
            $("td#internetMessageId").text(_item.internetMessageId);
        }
        else
        {
            $("td#internetMessageId").text(_msgOnly);
        }
    }
    
    // This property is available on only a meeting request,
    // response or cancellation, or an appointment item.
    // It represents a JavaScript Date object.
    var _getStart = function()
    {
        if (_isCalendarItem())
        {
            var date = _item.start;
            
            // Show how to extract the different components of 
            // a date-time value.
            var info = "";
            info += "Full Date : " + date.toString() + "<br/>";
            info += "Full Year : " + date.getFullYear() + "<br/>";
            // date.getMonth returns 0-based values, so increment by 1.
            info += "Month : " + (date.getMonth()+1) + "<br/>";
            info += "Day of Month : " + date.getDate() + "<br/>";
            info += "Day of Week : " + date.getDay() + "<br/>";
            info += "Hours : " + date.getHours() + "<br/>";
            info += "Minutes : " + date.getMinutes() + "<br/>";
            info += "Seconds : " + date.getSeconds() + "<br/>";
            
            $("td#start").html(info);
        }
        else
        {
            $("td#start").text(_calOnly);
        }
    }
    
    // This property is available on only a meeting request,
    // response or cancellation, or an appointment item.
    // It represents a JavaScript Date object.
    var _getEnd = function()
    {
        if (_isCalendarItem())
        {
            var date = _item.end;
            
            var info = "";
            info += "Full Date : " + date.toString() + "<br/>";
            info += "Full Year : " + date.getFullYear() + "<br/>";
            // date.getMonth returns 0-based values, so increment by 1.
            info += "Month : " + (date.getMonth()+1) + "<br/>";
            info += "Day of Month : " + date.getDate() + "<br/>";
            info += "Day of Week : " + date.getDay() + "<br/>";
            info += "Hours : " + date.getHours() + "<br/>";
            info += "Minutes : " + date.getMinutes() + "<br/>";
            info += "Seconds : " + date.getSeconds() + "<br/>";
            
            $("td#end").html(info);
        }
        else
        {
            $("td#end").text(_calOnly);
        }
    }
    
    // This property is available on only a meeting request,
    // response or cancellation, or an appointment item.
    var _getLocation = function()
    {
        if (_isCalendarItem())
        {
            $("td#location").text(_item.location);
        }
        else
        {
            $("td#location").text(_calOnly);
        }
    }
    
    this.start = function()
    {
        _showAPIReady();
        // The following properties are available on
        // appropriate items for all mail apps 
        // independent of permission.
        _getSubject();
        _getNormalizedSubject();
        _getItemClass();
        _getItemType();
        _getDateTimeCreated();
        _getDateTimeModified();
        _getItemId();
        _getConversationId();
        _getInternetMessageId();
        _getStart();
        _getEnd();
        _getLocation();
    }
}

Olk.ItemProps.Ext.init = function InitExt()
{
    // Event handler for the Office.initialize event
    // to make sure the runtime environment is ready.
    Office.initialize = function ()
    {
        // Instantiates an instance of the object Ext.
        var myExt = 
            new Olk.ItemProps.Ext(Office.context.mailbox);

        // Checks for the DOM to load.
        $(document).ready (function() {
            // Both runtime environment and
            // DOM are ready, start mail app code.
            myExt.start();
        });
    }
}

Olk.ItemProps.Ext.init();

The following is a listing of itemPropsRD.js which displays properties accessible to the Debug (Other) mail app that has read item permission.

/*
 * File     : itemPropsRD.js
 * Author   : Microsoft
 */

Type.registerNamespace('Olk.ItemProps');

// This function determines and displays
// properties values that are available 
// on the selected item. This function 
// assumes the mail app has read item or
// read-write mailbox permission.
Olk.ItemProps.Ext = function ItemPropsExt(appOm)
{
    var _item = appOm.item;
    
    var _msgOnly = 
        "Only available on the MESSAGE object.";
    var _apptOnly = 
        "Only available on the APPOINTMENT object.";
    var _calOnly = 
        "Only available on appointment or meeting request items.";
    
    // Check if an item is an appointment or meeting request.
    var _isCalendarItem = function()
    {
        if ( (_item.itemType == 
            Office.MailboxEnums.ItemType.Appointment) ||
             (_item.itemClass.indexOf("IPM.Schedule") != -1) )
        {
            return true;
        }
        
        return false;
    }

    // Check if the current user is the organizer of a meeting.
    var _isOrganizer = function()
    {
        if ( (_item.itemType == 
            Office.MailboxEnums.ItemType.Appointment) &&
            (appOm.userProfile.emailAddress == 
                _item.organizer.emailAddress) )
        {
            return true;
        }
        
        return false;
    }
    
    var _showAPIReady = function()
    {
        $("div#apiReady").text("API IS READY");
        $("body").css("background-color", "#298ed6");
        $("body").css("color", "#ffffff");
    }
    
    // UserProfile is available independent of an item.
    var _getUserProfile = function()
    {
        var profile = appOm.userProfile;
        var info = "";

        // Show how to extract the 3 properties of 
        // a UserProfile object.
        info += "Display Name : " + profile.displayName 
            + "<br/>";
        info += "Email Address : " + profile.emailAddress 
            + "<br/>";
        info += "Time Zone : " + profile.timeZone;
        
        $("td#userProfile").html(info);
    }
    
    // This property is available on the Message or
    // Appointment object.
    var _getSubject = function()
    {
        $("td#subject").text(_item.subject);
    }
    
    // This property is available on the Message or
    // Appointment object.
    var _getNormalizedSubject = function()
    {
        $("td#normalizedSubject").text(_item.normalizedSubject);
    }
    
    // This property is available on the Message or
    // Appointment object.
    var _getItemClass = function()
    {
        $("td#itemClass").text(_item.itemClass);
    }
    
    // This property is available on the Message or
    // Appointment object.
    var _getItemType = function()
    {
        $("td#itemType").text(_item.itemType);
    }
    
    // This property is available on the Message or
    // Appointment object. 
    // It represents a JavaScript Date object.
    var _getDateTimeCreated = function()
    {
        var date = _item.dateTimeCreated;
        
        // Show how to extract the different components of 
        // a date-time value.
        var info = "";
        info += "Full Date : " + date.toString() + "<br/>";
        info += "Full Year : " + date.getFullYear() + "<br/>";
        // date.getMonth returns 0-based values, so increment by 1.
        info += "Month : " + (date.getMonth()+1) + "<br/>";
        info += "Day of Month : " + date.getDate() + "<br/>";
        info += "Day of Week : " + date.getDay() + "<br/>";
        info += "Hours : " + date.getHours() + "<br/>";
        info += "Minutes : " + date.getMinutes() + "<br/>";
        info += "Seconds : " + date.getSeconds() + "<br/>";
        
        $("td#dateTimeCreated").html(info);
    }
    
    // This property is available on the Message or
    // Appointment object.
    // It represents a JavaScript Date object.
    var _getDateTimeModified = function()
    {
        var date = _item.dateTimeModified;
        
        // Show how to extract the different components of 
        // a date-time value.
        var info = "";
        info += "Full Date : " + date.toString() + "<br/>";
        info += "Full Year : " + date.getFullYear() + "<br/>";
        // date.getMonth returns 0-based values, so increment by 1.
        info += "Month : " + (date.getMonth()+1) + "<br/>";
        info += "Day of Month : " + date.getDate() + "<br/>";
        info += "Day of Week : " + date.getDay() + "<br/>";
        info += "Hours : " + date.getHours() + "<br/>";
        info += "Minutes : " + date.getMinutes() + "<br/>";
        info += "Seconds : " + date.getSeconds() + "<br/>";
        
        $("td#dateTimeModified").html(info);
    }
    
    // This property is available on the Message or
    // Appointment object.
    var _getItemId = function()
    {
        $("td#itemId").text(_item.itemId);
    }

    // This property is available on only the Message object.    
    var _getConversationId = function()
    {
        if (_item.itemType == Office.MailboxEnums.ItemType.Message)
        {
            $("td#conversationId").text(_item.conversationId);
        }
        else
        {
            $("td#conversationId").text(_msgOnly);
        }
    }
    
    // This property is available on only the Message object.
    var _getInternetMessageId = function()
    {
        if (_item.itemType == Office.MailboxEnums.ItemType.Message)
        {
            $("td#internetMessageId").text(_item.internetMessageId);
        }
        else
        {
            $("td#internetMessageId").text(_msgOnly);
        }
    }
    
    // This property is available on only a meeting request,
    // response or cancellation, or an appointment item.
    // It represents a JavaScript Date object.
    var _getStart = function()
    {
        if (_isCalendarItem())
        {
            var date = _item.start;
            
            // Show how to extract the different components of 
            // a date-time value.
            var info = "";
            info += "Full Date : " + date.toString() + "<br/>";
            info += "Full Year : " + date.getFullYear() + "<br/>";
            // date.getMonth returns 0-based values, so increment by 1.
            info += "Month : " + (date.getMonth()+1) + "<br/>";
            info += "Day of Month : " + date.getDate() + "<br/>";
            info += "Day of Week : " + date.getDay() + "<br/>";
            info += "Hours : " + date.getHours() + "<br/>";
            info += "Minutes : " + date.getMinutes() + "<br/>";
            info += "Seconds : " + date.getSeconds() + "<br/>";
            
            $("td#start").html(info);
        }
        else
        {
            $("td#start").text(_calOnly);
        }
    }
    
    // This property is available on only a meeting request,
    // response or cancellation, or an appointment item.
    // It represents a JavaScript Date object.
    var _getEnd = function()
    {
        if (_isCalendarItem())
        {
            var date = _item.end;
            
            // Show how to extract the different components of 
            // a date-time value.
            var info = "";
            info += "Full Date : " + date.toString() + "<br/>";
            info += "Full Year : " + date.getFullYear() + "<br/>";
            // date.getMonth returns 0-based values, so increment by 1.
            info += "Month : " + (date.getMonth()+1) + "<br/>";
            info += "Day of Month : " + date.getDate() + "<br/>";
            info += "Day of Week : " + date.getDay() + "<br/>";
            info += "Hours : " + date.getHours() + "<br/>";
            info += "Minutes : " + date.getMinutes() + "<br/>";
            info += "Seconds : " + date.getSeconds() + "<br/>";
            
            $("td#end").html(info);
        }
        else
        {
            $("td#end").text(_calOnly);
        }
    }
    
    // This property is available on only a meeting request,
    // response or cancellation, or an appointment item.
    var _getLocation = function()
    {
        if (_isCalendarItem())
        {
            $("td#location").text(_item.location);
        }
        else
        {
            $("td#location").text(_calOnly);
        }
    }

    // This property is available on only the Message object.
    // If the message is sent by a delegate, then the From property
    // represents the delegator, and the Sender property represents
    // the delegate. If there is no delegation, the Sender property
    // and From property represents the same person.    
    var _getFrom = function()
    {
        if (_item.itemType == Office.MailboxEnums.ItemType.Message)
        {
            var from = _item.from;
            
            // This property is an EmailAddressDetails object.
            // Show how to extract a couple of properties of this
            // object.
            var info = "";
            info += "Display Name : " + from.displayName + "<br/>";
            info += "Email Address : " + from.emailAddress;
            
            $("td#from").html(info);
        }
        else
        {
            $("td#from").text(_msgOnly);
        }
    }
    
    // This property is available on only the Message object.
    // If the message is sent by a delegate, then the From property
    // represents the delegator, and the Sender property represents
    // the delegate. If there is no delegation, the Sender property
    // and From property represents the same person. 
    var _getSender = function()
    {
        if (_item.itemType == Office.MailboxEnums.ItemType.Message)
        {
            var sender = _item.sender;
            
            // This property is an EmailAddressDetails object.
            // Show how to extract a couple of properties of this
            // object.
            var info = "";
            info += "Display Name : " + sender.displayName + "<br/>";
            info += "Email Address : " + sender.emailAddress;
            
            $("td#sender").html(info);
        }
        else
        {
            $("td#sender").text(_msgOnly);
        }
    }
    
    // This property is available on only the Message object.
    var _getTo = function()
    {
        if (_item.itemType == Office.MailboxEnums.ItemType.Message)
        {
            var to = _item.to;
            
            // This property is an array of EmailAddressDetails 
            // objects. Show how to extract a few properties 
            // of each of these objects.
            var displayNames = "Display Names : ";
            var emailAddresses = "Email Addresses : ";
            var recipientTypes = "Recipient Type : ";
            
            for (var i = 0; i < to.length; i++)
            {
                displayNames += to[i].displayName;
                emailAddresses += to[i].emailAddress;
                recipientTypes += to[i].recipientType;
                
                if (i != to.length-1)
                {
                    displayNames += ",";
                    emailAddresses += ",";
                    recipientTypes += ",";
                }
            }
            
            $("td#to").html(displayNames + "<br/>" 
                + emailAddresses + "<br/>" + recipientTypes);
        }
        else
        {
            $("td#to").text(_msgOnly);
        }
    }
    
    var _getCc = function()
    {
        if (_item.itemType == Office.MailboxEnums.ItemType.Message)
        {
            var cc = _item.cc;
            
            // This property is an array of EmailAddressDetails 
            // objects. Show how to extract a few properties 
            // of each of these objects.
            var displayNames = "Display Names : ";
            var emailAddresses = "Email Addresses : ";
            var recipientTypes = "Recipient Type : ";
            
            for (var i = 0; i < cc.length; i++)
            {
                displayNames += cc[i].displayName;
                emailAddresses += cc[i].emailAddress;
                recipientTypes += cc[i].recipientType;
                
                if (i != cc.length-1)
                {
                    displayNames += ",";
                    emailAddresses += ",";
                    recipientTypes += ",";
                }
            }
            
            $("td#cc").html(displayNames + "<br/>" 
                + emailAddresses + "<br/>" + recipientTypes);
        }
        else
        {
            $("td#cc").text(_msgOnly);
        }
    }
    
    // This property is available on only the Appointment object.
    var _getOrganizer = function()
    {
        if (_item.itemType == Office.MailboxEnums.ItemType.Appointment)
        {
            var organizer = _item.organizer;
            
            // This property is an EmailAddressDetails object.
            // Show how to extract a couple of properties of this
            // object.
            var info = "";
            info += "Display Name : " + organizer.displayName + "<br/>";
            info += "Email Address : " + organizer.emailAddress;
            
            $("td#organizer").html(info);
        }
        else
        {
            $("td#organizer").text(_apptOnly);
        }
    }
    
    // This property is available on only the Appointment object.
    var _getRequiredAttendees = function()
    {
        if (_item.itemType == Office.MailboxEnums.ItemType.Appointment)
        {
            var attendees = _item.requiredAttendees;
            

            // This property is an array of EmailAddressDetails 
            // objects. Show how to extract a few properties 
            // of each of these objects.
            var displayNames = "Display Names : ";
            var emailAddresses = "Email Addresses : ";
            var recipientTypes = "Recipient Types : ";
            var appointmentResponses = "Appointment Responses : ";
            
            var getAppointmentResponses = false;

            // Responses of required attendees are accessible to 
            // only the organizerof the meeting.
            if (_isOrganizer())
            {
                getAppointmentResponses = true;
            }
            else
            {
                appointmentResponses += "You are not the organizer.";
            }
            
            for (var i = 0; i < attendees.length; i++)
            {
                displayNames += attendees[i].displayName;
                emailAddresses += attendees[i].emailAddress;
                recipientTypes += attendees[i].recipientType;
                
                if (i != attendees.length-1)
                {
                    displayNames += ",";
                    emailAddresses += ",";
                    recipientTypes += ",";
                }
                
                if (getAppointmentResponses)
                {
                    appointmentResponses += attendees[i].appointmentResponse;
                    
                    if (i != attendees.length-1)
                    {
                        appointmentResponses += ",";
                    }
                }
            }
            
            $("td#requiredAttendees").html(displayNames + "<br/>" + 
                emailAddresses + "<br/>" +  
                recipientTypes + "<br/>" + 
                appointmentResponses);
        }
        else
        {
            $("td#requiredAttendees").text(_apptOnly);
        }
    }
    
    // This property is available on only the Appointment object.
    var _getOptionalAttendees = function()
    {
        if (_item.itemType == Office.MailboxEnums.ItemType.Appointment)
        {
            var attendees = _item.optionalAttendees;
            

            // This property is an array of EmailAddressDetails 
            // objects. Show how to extract a few properties 
            // of each of these objects.
            var displayNames = "Display Names : ";
            var emailAddresses = "Email Addresses : ";
            var recipientTypes = "Recipient Types : ";
            var appointmentResponses = "Appointment Responses : ";
            
            var getAppointmentResponses = false;

            // Responses of optional attendees are accessible to 
            // only the organizer of the meeting.
            if (_isOrganizer())
            {
                getAppointmentResponses = true;
            }
            else
            {
                appointmentResponses += "You are not the organizer.";
            }
            
            for (var i = 0; i < attendees.length; i++)
            {
                displayNames += attendees[i].displayName;
                emailAddresses += attendees[i].emailAddress;
                recipientTypes += attendees[i].recipientType;
                
                if (i != attendees.length-1)
                {
                    displayNames += ",";
                    emailAddresses += ",";
                }
                
                if (getAppointmentResponses)
                {
                    appointmentResponses += attendees[i].appointmentResponse;
                    
                    if (i != attendees.length-1)
                    {
                        appointmentResponses += ",";
                    }
                }
            }
            
            $("td#optionalAttendees").html(displayNames + "<br/>" + 
                emailAddresses + "<br/>" +  
                recipientTypes + "<br/>" + 
                appointmentResponses);
        }
        else
        {
            $("td#optionalAttendees").text(_apptOnly);
        }
    }

    // This property is available on only the Appointment object.    
    var _getResources = function()
    {
        if (_item.itemType == Office.MailboxEnums.ItemType.Appointment)
        {
            var resources = _item.resources;
            
            var displayNames = "Display Names : ";
            var emailAddresses = "Email Addresses : ";
            var recipientTypes = "Recipient Types : ";
            var appointmentResponses = "Appointment Responses : ";
            
            var getAppointmentResponses = false;

            // Responses of resources are available to only the 
            // organizer of the meeting.
            if (_isOrganizer())
            {
                getAppointmentResponses = true;
            }
            else
            {
                appointmentResponses += "You are not the organizer.";
            }
            
            for (var i = 0; i < resources.length; i++)
            {
                displayNames += resources[i].displayName;
                emailAddresses += resources[i].emailAddress;
                recipientTypes += resources[i].recipientType;
                
                if (i != resources.length-1)
                {
                    displayNames += ",";
                    emailAddresses += ",";
                    recipientTypes += ",";
                }
                
                if (getAppointmentResponses)
                {
                    appointmentResponses += 
                        resources[i].appointmentResponse;
                    
                    if (i != resources.length-1)
                    {
                        appointmentResponses += ",";
                    }
                }
            }
            
            $("td#resources").html(displayNames + "<br/>" + 
                emailAddresses + "<br/>" + 
                recipientTypes + "<br/>" + 
                appointmentResponses);
        }
        else
        {
            $("td#resources").text(_apptOnly);
        }
    }

    this.start = function()
    {
        _showAPIReady();

        // The following properties are available on
        // appropriate items for all mail apps 
        // independent of permission.
        _getSubject();
        _getNormalizedSubject();
        _getItemClass();
        _getItemType();
        _getDateTimeCreated();
        _getDateTimeModified();
        _getItemId();
        _getConversationId();
        _getInternetMessageId();
        _getStart();
        _getEnd();
        _getLocation();
        // The following properties are available
        // only if the mail app has requested read item
        // or read-write mailbox permission.
        _getUserProfile();
        _getFrom();
        _getSender();
        _getTo();
        _getCc();
        _getOrganizer();
        _getRequiredAttendees();
        _getOptionalAttendees();
        _getResources();
    }
}

Olk.ItemProps.Ext.init = function InitExt()
{
    // Event handler for the Office.initialize event
    // to make sure the runtime environment is ready.
    Office.initialize = function ()
    {
        // Instantiates an instance of the object Ext.
        var myExt = 
            new Olk.ItemProps.Ext(Office.context.mailbox);

        // Checks for the DOM to load.
        $(document).ready (function() {
            // Both runtime environment and
            // DOM are ready, start mail app code.
            myExt.start();
        });
    }
}

Olk.ItemProps.Ext.init();

Community Additions

ADD
Show:
© 2014 Microsoft. All rights reserved.