<?xml version="1.0" ?>
<!DOCTYPE MACROS SYSTEM "macros.dtd">
<MACROS>


<!-- DOCUMENT-EVENT-BOUND DITA DOCUMENT OPERATIONS -->
<!-- DOCUMENT-EVENT-BOUND DITA DOCUMENT OPERATIONS -->
<!-- DOCUMENT-EVENT-BOUND DITA DOCUMENT OPERATIONS -->
    
<MACRO name="On_Macro_File_Load" lang="JScript" hide="true"><![CDATA[

  //========================================================================
  // FUNCTIONS: Dita doc-level convience functions.  Functions must be
  //   doc-level in order to be visible for XMAX-DITA systems.
  //========================================================================
  function __XM_DITA_GetDitaAppHandler__()
  {
    var xmsMgr = ActiveDocument.Host.QueryService("XMSERVICEMGR");
    if (!xmsMgr) { 
      return null;
    }
    return xmsMgr.FindByType("DITAAPP");
  }
  //========================================================================
  function __XM_DITA_GetDitaDocHandler__()
  {
    var ditaApp = __XM_DITA_GetDitaAppHandler__();
    if (!ditaApp) {
      return null;
    }
    return ditaApp.getDitaDocHandler(ActiveDocument);
  }
  //========================================================================
  function __XM_DITA_GetXMAppService__()
  {
    var xmsMgr = ActiveDocument.Host.QueryService("XMSERVICEMGR");
    if (!xmsMgr) {
      return null;
    }
    return xmsMgr.FindByType("XMAPPLICATION");
  }
  //========================================================================
  function __XM_DITA_InjectSpecializationExtender__()
  {
    // Auto-load specialization Jscript extension into the scope of THIS
    // doc-level script engine...binding-by-rules-name for factory functor
    // and implementation in filename in same location as the rules/dtd

    var xmApp = __XM_DITA_GetXMAppService__();
    if (!xmApp)
      return null;
    var ditaApp = __XM_DITA_GetDitaAppHandler__();
    if (!ditaApp)
      return null;
    
    
    // DitaApp has standard algorithm for generating the factory functor
    // name expected for the DitaSpecializationExtender instance and even
    // determines if implementation is available...
    
    var dspDetails = ditaApp.getDitaSpecExtenderDetails(ActiveDocument);
    if (!dspDetails)
      return null;
      
    var hdlrExtFile    = dspDetails.hdlrExtFile;
    var hdlrExtFactory = dspDetails.hdlrExtFactory;
    var hdlrExtSrc     = dspDetails.hdlrExtSrc;


    // Inject extender impl and get reference to extender functor
    // but guard against script errors...
    
    var hdlrExtClass = null;
    try {
      eval(hdlrExtSrc);                                // Load impl
      eval("hdlrExtClass = " + hdlrExtFactory + ";");  // Get functor
    } catch (e) {
      hdlrExtClass = null;
      xmApp.MessageService.Alert("Failed to parse specialization extender, \n\n\""
                               + hdlrExtFile + "\".\n\n"
                               + "Some features or functions may be disabled. Please contact your DITA customizer.");
    }


    // Return extender factory function
    return hdlrExtClass;
  }
  //========================================================================

]]></MACRO>

<MACRO name="On_CommandBars_Load_Complete" lang="JScript" hide="true"><![CDATA[

  //========================================================================
  // Inform DitaApp that doc-level commandbars are loaded so we can give
  // the specializer an opportunity to add/remove items. 
  // DITA.REFACTOR.TODO - This event will only fire for XMAU
  // DITA.REFACTOR.TODO - Why not a DitaDocHandler method?
  //========================================================================
  
  var ditaApp = __XM_DITA_GetDitaAppHandler__();
  if (ditaApp) { 
    ditaApp.OnCommandBarsLoadComplete(ActiveDocument);
  }
  ditaApp = null;
  //========================================================================

]]></MACRO>

<MACRO name="On_Document_Open_Complete" lang="JScript" hide="true"><![CDATA[

  //========================================================================
  // BOOTSTRAP: Inform DitaApp service of Dita XML instance open now
  //   for editing (tell DitaAppHandler to create DitaMapDocHandler) and
  //   provide any extension now... 
  //========================================================================
  
  var ditaApp = __XM_DITA_GetDitaAppHandler__();
  if (ditaApp) { 
    ditaApp.OnDocumentOpenComplete(ActiveDocument, __XM_DITA_InjectSpecializationExtender__(), "BOOKMAP");
  }
  ditaApp = null;
  //========================================================================

]]></MACRO>

<MACRO name="On_Document_Close" lang="JScript" hide="true"><![CDATA[
    //Important: to prevent hanging
    DitaMap.EventSink.OnDocumentClose();                                                                                                                                    
]]></MACRO>


<MACRO name="On_Before_Document_Validate" lang="JScript" hide="true"><![CDATA[
    DitaMap.EventSink.OnBeforeDocumentValidate();                                                                                                                                    
]]></MACRO>


<MACRO name="On_Before_Document_Preview" lang="JScript" hide="true"><![CDATA[
    DitaMap.EventSink.OnBeforeDocumentPreview();                                                                                                                                    
]]></MACRO>

<MACRO name="On_Context_Menu" lang="JScript" hide="true"><![CDATA[
    DitaMap.EventSink.OnContextMenu();                                                                                                                                    
]]></MACRO>
  
  

<MACRO name="On_Document_First_Draw" lang="JScript" hide="true"><![CDATA[
    DitaMap.EventSink.OnDocumentFirstDraw();                                                                                                                                    
]]></MACRO>

  
<MACRO name="On_Document_Open_View" lang="JScript" hide="true"><![CDATA[
    DitaMap.EventSink.OnDocumentOpenView();                                                                                                                                    
]]></MACRO>

<MACRO name="On_Double_Click" lang="JScript" hide="true"><![CDATA[
    DitaMap.EventSink.OnDoubleClick(ActiveDocument);
]]></MACRO>

<MACRO name="On_Drop_Files" lang="JScript" hide="true"><![CDATA[
    DitaMap.EventSink.OnDropFiles();                                                                                                                                    
]]></MACRO>

<MACRO name="On_ElementList_Insert" lang="JScript" hide="true"><![CDATA[
  DitaMap.EventSink.OnElementListInsert();
]]></MACRO>

<MACRO name="On_Table_Elements_Inserted" lang="JScript" hide="true"><![CDATA[
  DitaMap.EventSink.OnTableElementsInserted();
]]></MACRO>

<MACRO name="On_Update_ElementList" lang="JScript" hide="true"><![CDATA[
  DitaMap.EventSink.OnUpdateElementList();
]]></MACRO>


<MACRO name="On_Update_UI" lang="JScript" hide="true"><![CDATA[
    DitaMap.EventSink.OnUpdateUI();                                                                                                                                    
]]></MACRO>

<MACRO name="On_View_Change" lang="JScript" hide="true"><![CDATA[
    DitaMap.EventSink.OnViewChange();                                                                                                                                    
]]></MACRO>

<MACRO name="On_Start_Document_SaveAs" lang="JScript" hide="true"><![CDATA[
    DitaMap.EventSink.OnStartDocumentSaveAs();                                                                                                                                    
]]></MACRO>

<MACRO name="On_Before_Document_SaveAs" lang="JScript" hide="true"><![CDATA[
    DitaMap.EventSink.OnBeforeDocumentSaveAs();                                                                                                                                    
]]></MACRO>

<MACRO name="On_After_Set_Attribute_From_AI" lang="JScript" hide="true"><![CDATA[
    DitaMap.EventSink.OnAfterSetAttributeFromAI();
]]></MACRO>


<!-- SHORTCUT-BOUND DITA DOCUMENT OPERATIONS -->
<!-- SHORTCUT-BOUND DITA DOCUMENT OPERATIONS -->
<!-- SHORTCUT-BOUND DITA DOCUMENT OPERATIONS -->

<MACRO name="__XMDITA_CurrentElementHelp__" lang="JScript" key="Alt+F1" desc="Show element help" hide="true"><![CDATA[

  // Delegate to DitaApp to show help topic for current element...
  var ditaApp = __XM_DITA_GetDitaAppHandler__();
  if (ditaApp) {
    ditaApp.doCurrentElementHelp(ActiveDocument.Range);
  }
  ditaApp = null;

]]></MACRO>

<MACRO name="GenerateMapOutputForActiveMapXacInstance" lang="JScript" key="Ctrl+G" desc="Generate output" hide="true"><![CDATA[

  // If this Ctrl+G runs, print the 'active' map XAC instance...
  var ditaApp  = __XM_DITA_GetDitaAppHandler__();
  if (ditaApp && ditaApp.getRenditionsService()) {
    ditaApp.getRenditionsService().doDocPrint(false, true);
  }
  ditaApp = null;

]]></MACRO>

<MACRO name="AltEnterKeyOverride" lang="JScript" key="Alt+Enter" desc="Show properties" hide="true"><![CDATA[

  // DITA.REFACTOR.TODO - Change macro name to "__XM_DITA_ALTENTERKEYOVERRIDE__" + TBR stuff
  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.doAltEnterKey();
  }
  ditaDoc = null;

]]></MACRO>

<MACRO name="Update_All_References" lang="JScript" key="F11" desc="Update all references" hide="true"><![CDATA[

  // DITA.REFACTOR.TODO - Change macro name to "__XM_UPDATE_ALL_REFERENCES__" + TBR stuff
  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.doUpdateAllReferences(ActiveDocument);
  }
  ditaDoc = null;

]]></MACRO>

<!-- ATOMIC-UNDOABLE DITA DOCUMENT OPERATION DISPATCHER -->
<!-- ATOMIC-UNDOABLE DITA DOCUMENT OPERATION DISPATCHER -->
<!-- ATOMIC-UNDOABLE DITA DOCUMENT OPERATION DISPATCHER -->

<MACRO name="__XM_DITA_DISPATCHER__" lang="JScript" hide="true"><![CDATA[

  // DISPATCHER: Macro is intended to be used by the XM-DITA application
  //   to execute a Dita document mutation and whereby such mutations need
  //   to be atomic (i.e. undoable). 
  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  try {
    eval("ditaDoc." + ditaDoc.getDispatcherOpStr());
  } catch (e) {
    // TODO:
  }
  ditaDoc = null;
  
]]></MACRO>

</MACROS>
