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();  

    June 03

    Understanding Corporate Performance Management for $1

    If you’re serious about having conversations with professional managers around corporate performance management an understanding of some of its key underlying principals can be invaluable; reading “Managing in a Time of Great Change” is probably one of the fastest ways to ramp on those concepts, many of which are as relevant today as they were 15 years ago (some even more so, surprisingly)

    The upside of its being out-of-print is that you can buy copies on the internet for less than a dollar right now; for those that do buy this book it’ll probably be one of the highest ROI investments you’ll ever make J

    http://www.amazon.com/Managing-Great-Change-Peter-Drucker/dp/0452278376

    The worldview of management guru Drucker is carefully thought out and simply composed, which makes his works easy to digest. Similar to his Managing for the Future (LJ 1/92), this book is a collection of essays and articles previously published in well-known periodicals since 1991. Drucker selected pieces that received positive responses and made them into chapters arranged by four topics: management, information-based organization, the economy, and society. In some instances, a few essays were lengthened, and the epilog was written strictly for the book. Executives and longtime Drucker aficionados will particularly enjoy having these well-regarded essays in one package. Highly recommended for all business collections.

    --Rebecca A. Smith, Harvard Business School Library