Ian's profileIan Tien's Unofficial Pe...PhotosBlogListsMore Tools Help

Blog


    June 20

    Unified Communications and your business application solution

    Surely you’ve been on an intranet site or reviewing a report and you see someone’s name who you’d like to reach out to.

    Imagine if it were possible to:

    - See the person’s availability status
    - Call the person using VOIP from your laptop or using your office phone
    -
    Send the person an instant message
    -
    Send the person an email
    -
    See the person’s Office location so you can walk over for a chat
    -
    Check the person’s calendar and schedule a meeting
    - Look up that person’s information in your Outlook address book or corporate directory
    - Do some other pre-defined action from your current context

    Would you believe you could do this all TODAY using Microsoft Office Live Communication Server?

    You can!

    Learn more and download the trial version of Live Communication Server here: http://office.microsoft.com/en-us/communicationsserver

    If you’re building out a Duet solution, a Microsoft BI solution, or a custom solution, you can take advantage of the native functionality in Internet Explorer and Outlook for presence information.

    Below is a sample HTML page with icons and scripts showing how you can integrate Microsoft Office presence information and functionality into anything with a modern HTML reader, such the one that comes in Outlook (see screenshot below). 

    Many thanks to Ramesh for putting together the sample. Interestingly, Ramesh was originally on the Duet team in 2005 and moved over to the Microsoft BI team; I was originally on the Microsoft BI team and moved over to Duet some years later.

    Small world J 

    RTC.htm

    <HTML><SCRIPT LANGUAGE="JavaScript" SRC="rtc.js"></SCRIPT><link href="style.css" type="text/css" rel="stylesheet"><table ><tr class="TableHeaderCellStyle1"><td>Name</td><td>Title</td></tr><tr><td><span>Ian Tien<img border='0' height='1' width='3' src='images/IMblank.gif'/> <img order='0' height='12' width='12' src='images/IMblank.gif' onload="IMNRC('iantien@microsoft.com')" id='RTC_iantien'></span></td><td> Program Manager</td></tr><tr><td><span>Corey Hulen<img border='0' height='1' width='3' src='images/IMblank.gif'/> <img border='0' height='12' width='12' rc='images/IMblank.gif' onload="IMNRC('coreyh@microsoft.com')" id='RTC_coreyh'></span></td><td>Software Design Engineer Lead</td></tr><tr><td><span>Chen-I im<img border='0' height='1' width='3' src='images/IMblank.gif'/> <img border='0' height='12' width='12' src='images/IMblank.gif' nload="IMNRC('chenilim@microsoft.com')" id='RTC_chenilim'></span></td><td>Software Dev Engineer</td></tr><tr><td><span>Ramesh Arimilli<img border='0' eight='1' width='3' src='images/IMblank.gif'/> <img border='0' height='12' width='12' src='images/IMblank.gif' onload="IMNRC('a-raarim@microsoft.com')" id='RTC_a-aarim'></span></td></tr></HTML>

    style.css

    /* Blue faded header */.TableHeaderCellStyle1{color: #ffffff;    font-weight: bold;           background-color: #C4CBE9;                border-top: solid 1px #DADEEE;                border-bottom: olid 1px #4A5A9A;                filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr='#ABB1CB', EndColorStr='#4A5A9A');              padding: 2px;     vertical-align: bottom;}.FramedTable{    border: solid 1px #ABB1CB ;}.ReportTableOverlineCell{        border-top: solid 1px #f0f0f0;}

    rtc.js  

    var IMNControlObj = null;var bIMNControlInited = false;var IMNDictionaryObj = null;var bIMNSorted = false;var bIMNOnloadAttached = false;var IMNOrigScrollFunc = ull;var bIMNInScrollFunc = false;var IMNSortableObj = null;var IMNHeaderObj = null;var IMNNameDictionaryObj = null;var IMNShowOfflineObj = null;function nsureIMNControl(){    if (!bIMNControlInited)    {        if (browseris.ie5up && browseris.win32)        {//@cc_on//@if (@_jscript_version >= 5)//@            try//@            {//@                MNControlObj = new ActiveXObject("Name.NameCtrl.1");//@            } catch(e)//@            {//@                //@            };//@else//@end        }        bIMNControlInited = true;        f (IMNControlObj)        {            IMNControlObj.OnStatusChange = IMNOnStatusChange;        }    }    return IMNControlObj;}function IMNGetStatusImage(state, howoffline){    var img = "blank.gif";    switch (state)    {        case 0:            img = "imnon.gif";        break;              case 1:            if (showoffline)            {                img = imnoff.gif";            }            else            {                img = "blank.gif";            }        break;          case 2:            img = "imnaway.gif";        break;        case 3:            img = imnbusy.gif";        break;        case 4:            img = "imnaway.gif";        break;        case 5:            img = "imnbusy.gif";        break;        case 6:            img = "imnaway.gif";        reak;    }    return img;}function IMNGetHeaderImage(){    return "imnhdr.gif";}function IMNIsOnlineState(state){    if (state == 1)    {            return false;    }    return true;}function IMNSortList(j, oldState, state){    var objTable = null;     var objRow = null;    if (IMNSortableObj && IMNSortableObj[j])    {        objRow = ocument.getElementById(j);        while (objRow && !(objRow.tagName == "TR" &&               typeof(objRow.Sortable) != "undefined"))        {            objRow = bjRow.parentNode;        }        objTable = objRow;        while (objTable && objTable.tagName != "TABLE")        {            objTable = objTable.parentNode;        }        if objTable = null && objRow != null)        {            if (objTable.rows[1].style.display == "none")            {                for (i=1; i<4; i++)                {                    objTable.rows[i].style.display = block";                }            }            if (!IMNIsOnlineState(oldState) && IMNIsOnlineState(state))            {                objTable.rows[2].style.display = "none";                 i = 3;                hile (objTable.rows[i].id != "Offline" && objTable.rows[i].innerText < objRow.innerText)                      i++;                objTable.moveRow(objRow.rowIndex, i);                 if        objTable.rows[objTable.rows.length - 3].id == "Offline")                {                       objTable.rows[objTable.rows.length - 2].style.display = "block";                 }            }            lse if (IMNIsOnlineState(oldState) && !IMNIsOnlineState(state))            {                if (objRow.rowIndex == 3 &&                  objTable.rows[objRow.rowIndex + 1].id == Offline")                {                       objTable.rows[2].style.display = "block";                 }                if (objTable.rows[objTable.rows.length - 3].id == "Offline")                {                       bjTable.rows[objTable.rows.length - 2].style.display = "none";                 }                i = objTable.rows.length - 2;                while (objTable.rows[i - 1].id != "Offline" && bjTable.rows[i].innerText > objRow.innerText)                    i--;                objTable.moveRow(objRow.rowIndex, i);             }        }    }}function IMNOnStatusChange(name, tate, id){    if (IMNDictionaryObj)    {        var img = IMNGetStatusImage(state, IMNSortableObj[id] ||                                    IMNShowOfflineObj[id]);        if IMNDictionaryObj[id] != state)        {            if (bIMNSorted)                IMNSortList(id, IMNDictionaryObj[id], state);            IMNUpdateImage(id, img);            MNDictionaryObj[id] = state;        }    }}function IMNUpdateImage(id, img){    var obj = document.images(id);    if (obj)    {        var oldImg = obj.src;        var index = ldImg.lastIndexOf("/");        var newImg = oldImg.slice(0, index + 1);        newImg += img;        if (oldImg != newImg)            obj.src = newImg;        if (obj.altbase)        {            bj.alt = obj.altbase;        }    }}function IMNHandleAccelerator(){    if (IMNControlObj)    {       if (event.altKey && event.shiftKey &&            event.keyCode==121)        {           MNControlObj.DoAccelerator();        }    }}function IMNGetOOUILocation(obj){    var objRet = new Object;    var objSpan = obj;    var objOOUI = obj;    var oouiX = 0, oouiY  , objDX = 0;    var fRtl = document.dir == "rtl";    while (objSpan && objSpan.tagName != "SPAN" && objSpan.tagName != "TABLE")    {        objSpan = objSpan.parentNode;        f (objSpan)    {       var collNodes = objSpan.tagName == "TABLE" ?                       objSpan.rows(0).cells(0).childNodes :                       objSpan.childNodes;       var i;       for (i = ;   ollNodes.length; ++i)       {              if (collNodes.item(i).tagName == "IMG" && collNodes.item(i).id)           {               objOOUI = collNodes.item(i);               break;           }       }        bj = objOOUI;    while (obj)    {        if (fRtl)        {             if (obj.scrollWidth >= obj.clientWidth + obj.scrollLeft)                          objDX = obj.scrollWidth - obj.clientWidth - bj.scrollLeft;                          else                  objDX = obj.clientWidth + obj.scrollLeft - obj.scrollWidth;             oouiX += obj.offsetLeft + objDX;        }        else            oouiX += bj.offsetLeft - obj.scrollLeft;        oouiY += obj.offsetTop - obj.scrollTop;        obj = obj.offsetParent;                }    try    {        obj = window.frameElement;        while (obj)                    f (fRtl)            {                if (obj.scrollWidth >= obj.clientWidth + obj.scrollLeft)                            objDX = obj.scrollWidth - obj.clientWidth - obj.scrollLeft;                             else                    bjDX = obj.clientWidth + obj.scrollLeft - obj.scrollWidth;                oouiX += obj.offsetLeft + objDX;            }            else                oouiX += obj.offsetLeft - obj.scrollLeft;            ouiY += obj.offsetTop - obj.scrollTop;            obj = obj.offsetParent;        }    } catch(e)    {    };    objRet.objSpan = objSpan;    objRet.objOOUI = objOOUI;    objRet.oouiX = ouiX;    objRet.oouiY = oouiY;    if (fRtl)        objRet.oouiX += objOOUI.offsetWidth;    return objRet;}function IMNShowOOUIMouse(){    IMNShowOOUI(0);}function MNShowOOUIKyb(){    IMNShowOOUI(1);}function IMNShowOOUI(inputType){    if (browseris.ie5up && browseris.win32)    {        var obj = window.event.srcElement;        ar objSpan = obj;        var objOOUI = obj;        var oouiX = 0, oouiY = 0;        if (EnsureIMNControl() && IMNNameDictionaryObj)        {            var objRet = MNGetOOUILocation(obj);            objSpan = objRet.objSpan;            objOOUI = objRet.objOOUI;            oouiX = objRet.oouiX;            oouiY = objRet.oouiY;            var name = MNNameDictionaryObj[objOOUI.id];            if (objSpan)                objSpan.onkeydown = IMNHandleAccelerator;            IMNControlObj.ShowOOUI(name, inputType, ouiX, ouiY);        }    }}function IMNHideOOUI(){    if (IMNControlObj)    {        IMNControlObj.HideOOUI();        return false;    }    return true;}function IMNScroll(){    if !bIMNInScrollFunc)    {        bIMNInScrollFunc = true;        IMNHideOOUI();    }    bIMNInScrollFunc = false;    return IMNOrigScrollFunc ? IMNOrigScrollFunc() : true;   }function IMNRC(name){    if (name == null || name == '')        return;    if (browseris.ie5up && browseris.win32)    {        var obj = window.event.srcElement;        var bjSpan  bj;        var id = obj.id;        var fFirst = false;        if (!IMNDictionaryObj)        {            IMNDictionaryObj = new Object();            IMNNameDictionaryObj = new Object();            MNSortableObj = new Object();            IMNShowOfflineObj = new Object();            if (!IMNOrigScrollFunc)            {                IMNOrigScrollFunc = window.onscroll;                indow.onscroll = IMNScroll;            }        }        if (IMNDictionaryObj)        {            if (!IMNNameDictionaryObj[id])            {                IMNNameDictionaryObj[id] = name;                First = true;            }            if (typeof(IMNDictionaryObj[id]) == "undefined")            {                IMNDictionaryObj[id] = 1;            }            if (!IMNSortableObj[id] &&                typeof(obj.Sortable) != "undefined"))            {                IMNSortableObj[id] = obj.Sortable;                if (!bIMNOnloadAttached)                {                    if (EnsureIMNControl() & MNControlObj.PresenceEnabled)                        window.attachEvent("onload", IMNSortTable);                    bIMNOnloadAttached = true;                }            }            if !IMNShowOfflineObj[id] &&                (typeof(obj.ShowOfflinePawn) != "undefined"))            {                IMNShowOfflineObj[id] = obj.ShowOfflinePawn;            }            if fFirst && EnsureIMNControl() && IMNControlObj.PresenceEnabled)            {                var state = 1, img;                state = IMNControlObj.GetStatus(name, id);                if IMNIsOnlineState(state) || IMNSortableObj[id] ||                    IMNShowOfflineObj[id])                {                    img = IMNGetStatusImage(state, IMNSortableObj[id] ||                                            MNShowOfflineObj[id]);                    IMNUpdateImage(id, img);                    IMNDictionaryObj[id] = state;                }            }                }        if (fFirst)        {            var objRet = MNGetOOUILocation(obj);            objSpan = objRet.objSpan;            if (objSpan)            {                objSpan.onmouseover = IMNShowOOUIMouse;                bjSpan.onfocusin  MNShowOOUIKyb;                objSpan.onmouseout = IMNHideOOUI;                objSpan.onfocusout = IMNHideOOUI;            }        }    }}function IMNSortTable(){    var id;    for id in IMNDictionaryObj)    {        IMNSortList(id, 1, IMNDictionaryObj[id]);    }    bIMNSorted = true;}function IMNRegisterHeader(){    if (browseris.ie5up && rowseris.win32)    {        var obj = window.event.srcElement;        if (!IMNHeaderObj)        {            IMNHeaderObj = new Object();        }        if (IMNHeaderObj)        {            var d = obj.id;            if (!IMNHeaderObj[id])            {                IMNHeaderObj[id] = id;                var img;                img = IMNGetHeaderImage();                IMNUpdateImage(id, mg);            }        }    }}function Browseris () {              var agt = navigator.userAgent.toLowerCase();        this.osver = 1.0;        if (agt)        {            var stOSVer = gt.substring(agt.indexOf("windows ") + 11);                    this.osver = parseFloat(stOSVer);        }            this.major = parseInt(navigator.appVersion);     this.nav = (agt.indexOf('mozilla')!=-1)&&((agt.indexOf('spoofer')==-1) && (agt.indexOf('compatible')==-1)));            this.nav2 = (this.nav && (this.major == 2));                this.nav3 = this.nav && (this.major == 3));            this.nav4 = (this.nav && (this.major == 4));          this.nav6 = this.nav && (this.major == 5);     this.nav6up = this.nav && (this.major >= );          this.nav7up = false;         if (this.nav6up) {                              var navIdx = agt.indexOf("netscape/");                 if (navIdx >=0 )                                  this.nav7up = arseInt(agt.substring(navIdx+9)) >= 7;   }              this.ie = (agt.indexOf("msie")!=-1);         this.aol = this.ie && agt.indexOf(" aol ")!=-1;            if (this.ie)                             {              var stIEVer = agt.substring(agt.indexOf("msie ") + 5);                     this.iever = parseInt(stIEVer);                            this.verIEFull = parseFloat(stIEVer);                         }              else                        this.iever = 0;                this.ie3 = ( this.ie && (this.major == 2));                this.ie4 = ( this.ie && (this.major == 4));                this.ie4up = this.ie && (this.major >=4);      this.ie5up = this.ie && (this.iever >= 5); this.ie55up = this.ie && (this.verIEFull >= 5.5);    this.ie6up = this.ie && (this.iever >= 6);    this.win16 = (agt.indexOf("win16")!=-1)               || (agt.indexOf("16bit")!=-1) || (agt.indexOf("windows 3.1")!=-1)               || (agt.indexOf("windows 16-bit")!=-1) );    this.win31 = agt.indexOf("windows 3.1")!=-1) || (agt.indexOf("win16")!=-1) ||                 (agt.indexOf("windows 16-bit")!=-1);    this.win98 = ((agt.indexOf("win98")!=-)||(agt.indexOf("windows 98")!=-1));    this.win95 = ((agt.indexOf("win95")!=-1)||(agt.indexOf("windows 95")!=-1));    this.winnt = ((agt.indexOf("winnt")!=-)||(agt.indexOf("windows nt")!=-1));    this.win32 = this.win95 || this.winnt || this.win98 ||                  ((this.major >= 4) && (navigator.platform == "Win32")) ||                 agt.indexOf("win32")!=-1) || (agt.indexOf("32bit")!=-1);    this.os2   = (agt.indexOf("os/2")!=-1)                  || (navigator.appVersion.indexOf("OS/2")!=-1)                   || agt.indexOf("ibm-webexplorer")!=-1);    this.mac    = (agt.indexOf("mac")!=-1);    this.mac68k = this.mac && ((agt.indexOf("68k")!=-1) ||                                agt.indexOf("68000")!=-1));    this.macppc = this.mac && ((agt.indexOf("ppc")!=-1) ||                                (agt.indexOf("powerpc")!=-1));    this.w3c = this.nav6up;}var rowseris = new Browseris();  

    Comments (2)

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.
    Ian Tien has turned off comments on this page.
    Picture of Anonymous
    jin wrote:
    ここがウワサのコンタクトレンズ超激安店!ザ・激安 コンタクトレンズ通販はあなたのニーズに合った各種コンタクトレンズを販売しています。1日使い捨て コンタクト レンズのワンデーアキュビューは毎日取り換えるわかりやすさが大好評。
    May 12
    Picture of Anonymous
    May 12

    Trackbacks

    The trackback URL for this entry is:
    http://iantien.spaces.live.com/blog/cns!749F6111096DD58C!3388.trak
    Weblogs that reference this entry
    • None