<!--NOTE: this file is expected to be ANSI - do not add any localizable strings to it !!! -->
<HTML>
<head>
<style>
    body        {margin:0; font: clientTop:0; icon; color: windowtext; background:window; overflow:none}
    .cInline    {
                display:inline; width:@@TASKWIDTH@@;
                margin-right:5px;
                vertical-align:top;
                }
    BottomPanel {overflow:auto}
    #FolderIcon {height:expression(TaskpadName.clientHeight + 10); width:100%;}
    #TaskpadName {font: caption; color:captiontext;  margin-left:0; margin-right:0; margin-top: 0; width:100%; border:0; padding-left:3; padding-top:5; padding-bottom:7;}
    #TaskpadDescription {font:icon; padding-left:5px; padding-top:5px; padding-bottom:3px; padding-right:5px}
    p           {font-weight:normal; border:0; margin-top:0}
    table       {font:icon; border:0 solid; padding:0; margin:0;}  <!--cellpadding and cellspacing only apply to table, but are NOT CSS attributes. Set them on a per-tag basis -->
    tr          {margin:0; border:0; padding:0}
    td          {margin:0; border:0 solid; padding:0}
    div         {border:0; margin:0; padding:0; }

    .Task       {color:expression(document.linkColor); text-decoration:underline; cursor:hand;}
    .TaskHover  {color:expression(document.linkColor); text-decoration:underline; cursor:hand;} <!-- Cannot use the user's hover color because once a link has been visited, the hover color never appears. So it is better
                                                             to be consistent than correct only part of the time -->
</style>
</head>

<!--update the task states for all appropriate events -->
<script language="JavaScript" for="MMCEvents" EVENT="OnSelectionChange(V, N)">UpdateState();</script>
<script language="JavaScript" for="MMCEvents" EVENT="OnContextMenuExecuted(MI)">UpdateState();</script>
<script language="JavaScript" for="MMCEvents" EVENT="OnViewChange(V, N)">UpdateState();</script>
<script language="JavaScript" for="MMCEvents" EVENT="OnToolbarButtonClicked()">UpdateState();</script>
<script language="JavaScript" for="MMCEvents" EVENT="OnListUpdated(V)">UpdateState();</script>

<script language = "JavaScript">

// Prevent text from being selected and messing up the UI.
function document.onselectstart()
{
    event.returnValue = false;
}

var reColumnPattern=/\$COL<([^>]+)>/;
var reNamePattern=/\$NAME<([^>]+)>/;
var reClipFmtPattern=/\$CLIPFMT_DATA<([^>]+)>/;
var regExpClipFmt = /(.*),(.*)/;

function GetCommandLineTaskState(s)
{
   var iCol, iName, iClip, nName, nCol, cCol;

   var Columns = external.Columns;

   var bEnabled = true; // enabled by default

   while (true) // search for COL tags
   {
      iCol  = s.search(reColumnPattern);
      if(iCol==-1) // no more $COL tags
         break;

      nCol=parseInt(RegExp.$1) + 1; // in console taskpads, the column is zero based. Convert it to one-based here.

      cCol = Columns.count;

      // make sure the column exists
      if(cCol < nCol)
         return false;

      // make sure the column is visible
      if(external.Columns(nCol).Hidden)
         return false;

      // must have exactly one item selected for command line tasks that contain column information
      if(external.Selection.count != 1)
         return false;

      s = s.substr(iCol+1); // skip to the next occurrence
   }

   while (true) // search for CLIPFMT tags
   {
      iClip = s.search(reClipFmtPattern);
      if(iClip==-1) // no more $CLIPFMT tags
         break;

      // Replace the clipfmt tags
      strRep = RegExp.$1; // the format at this point is item,format where item = r Or R for the current result item, 0 for the current scope item, 1 for the parent, and so on.
      strRep.search(regExpClipFmt);

      curItem  = RegExp.$1; // item

      if(curItem=='r' || curItem=='R')
      {
         if(external.Selection.count != 1)
            return false;
      }
      s = s.substr(iClip+1); // skip to the next occurrence
   }

   return true;
}

function UpdateState()
{
   var oObject   = document.all.tags("SPAN"); //get the collection of all hyperlinks on the page.
   var str       = "";
   var thisObject;
   var selectionmenu      = null;
   var scopemenu          = null;
   var menuItem  = null;
   var selection = external.Selection;
   var enabled   = false;
   var count     = selection.count;

   // get the scope node menu
   scopemenu = external.ScopeNodeContextMenu;

   // get the selection menu
   if(selection.Count != 0) // there is a selection
   {
      selectionmenu = external.SelectionContextMenu;
   }

   if(oObject != null)
   {
      for(i = 0; i!= oObject.length; i++)
      {
         thisObject = oObject(i);
         enabled = false;

         // set the state of result items
         if(thisObject.id == "ResultTask")
         {
            menuItem = null;
            if(selectionmenu != null)
               menuItem = selectionmenu(thisObject.parameter); // see if the object exists

            if(menuItem != null)
               if(menuItem.Enabled)
                  enabled = true;
         }

         else if(thisObject.id == "TargetTask") // set the state of target item tasks
         {
            menuItem = null;
            if(scopemenu != null)
               menuItem = scopemenu(thisObject.parameter); // see if the object exists

            if(menuItem != null)
               if(menuItem.Enabled)
                  enabled = true;
         }

         else if(thisObject.id == "CommandLineTask") // set the state of target item tasks
         {
            enabled = GetCommandLineTaskState(thisObject.parameter);
         }

         else // all other tasks are always available.
            enabled = true;


         // enable/disable the task based on the enabled state - the cInline object is displayed or hidden
         thisObject.parentNode.parentNode.parentNode.parentNode.parentNode.style.display = enabled ? ""  : "none" ;
      }
   }
}
</script>

<script language="JavaScript">

function GetNthParent(nNode)
{
   var curNode = external.ActiveScopeNode;

   for(i = 0; i != nNode; i++) // get the nth parent
      curNode = external.Document.ScopeNamespace.GetParent(curNode);

   return curNode;
}


/*+-------------------------------------------------------------------------*
*
* ParseParameters
*
* PURPOSE:     Performs parameter substitution. Substitute parameters are
*              specified as follows:
*              $COL[columnName]: Substitutes the entry under the column
*                      labelled columnName for the currently selected item.
*              $NAME[scopeNodeIndex]: Substitutes the name of the nth parent
*                      of the currently selected scope node. n=0 is the currently
*                      selected scope node itself.
*              $CLIPFMT_DATA[node,fmt]: Substitutes the clipboard format specified
*                      by fmt of the object specified by node, where node =
*                      r or R: The currently selected result item
*                      0, 1, 2...: The nth parent of the currently selected
*                      scope node
*
*
* NOTE:        The actual incoming parameters use angle braces, not square braces.
*              These are converted in a pre-process step to square braces because
*              jscript-xml interaction makes it difficult to use them here.
*
* RETURNS:
*    function
*
*+-------------------------------------------------------------------------*/
function ParseParameters(s)
{
   var t;
   var strRep;
   var strTemp = "";
   var re=/>/;
   var iCol, iName, iClip, nName, nCol;

   while (true) // search for COL tags
   {
      iCol  = s.search(reColumnPattern);
      if(iCol==-1) // no more $COL tags
         break;

      // Replace the column tags
      nCol = parseInt(RegExp.$1) + 1; // in console taskpads, the column is zero based. Convert it to one-based here.
      strRep = external.CellContents(external.Selection(1), nCol);
      strTemp = s.substr(0, iCol) + strRep;

      // move past the closing ">"
      s = s.substr(iCol);
      t = s.search(re);
      s = strTemp + s.substr(t+1);
   }

   while (true) // search for NAME tags
   {
      iName = s.search(reNamePattern);
      if(iName==-1) // no more $NAME tags
         break;

      // Replace the Name tags
      curNode = GetNthParent(RegExp.$1);

      strRep = curNode.Name;

      strTemp = s.substr(0, iName) + strRep;

      // move past the closing ">"
      s = s.substr(iName);
      t = s.search(re);
      s = strTemp + s.substr(t+1);
   }

   while (true) // search for CLIPFMT tags
   {
      iClip = s.search(reClipFmtPattern);
      if(iClip==-1) // no more $CLIPFMT tags
         break;

      // Replace the clipfmt tags
      strRep = RegExp.$1; // the format at this point is item,format where item = r Or R for the current result item, 0 for the current scope item, 1 for the parent, and so on.
      strRep.search(regExpClipFmt);

      curItem  = RegExp.$1; // item
      clipfmt  = RegExp.$2; // format

      if(curItem=='r' || curItem=='R')
         Node = external.Selection(1);
      else
         Node = GetNthParent(curItem);

      strRep = Node.Property(clipfmt); // get the clipboard format

      strTemp = s.substr(0, iClip) + strRep;

      // move past the closing ">"
      s = s.substr(iClip);
      t = s.search(re);
      s = strTemp + s.substr(t+1);
   }

   return s;
}
</script>


@@ORIENTATIONSPECIFICHTML@@

</HTML>