<?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 (and create DitaDocHandler) 
  //========================================================================
  
  // DITA.REFACTOR.TODO - Variation based on DTD/Rules is all we need...
  // ...could pass just ActiveDocument and let DitaAppHandler work it out
  // the details.
  
  var ditaApp = __XM_DITA_GetDitaAppHandler__();
  if (ditaApp) { 
    ditaApp.OnDocumentOpenComplete(ActiveDocument, __XM_DITA_InjectSpecializationExtender__());
  }
  ditaApp = null;
  //========================================================================

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnBeforeDocumentPreview();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnBeforeDocumentSave();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnStartDocumentSaveAs();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnBeforeDocumentSaveAs();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnBeforeDocumentValidate();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnClick();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnDoubleClick();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnContextMenu();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnDocumentAfterDropText();
  }
  ditaDoc = null;

]]></MACRO>

<MACRO name="On_Document_Before_DropText" lang="JScript" desc="Called when text is dropped into a document, but before it is rendered. Used to modify strings that are moved or copied with copy-and-paste or drag-and-drop operations in a document." hide="true"><![CDATA[

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnDocumentBeforeDropText();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnDocumentClose();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnDocumentFirstDraw();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnDropFiles();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnElementListInsert();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnUpdateElementList();
  }
  ditaDoc = null;

]]></MACRO>

<MACRO name="On_Update_UI" lang="JScript" desc="Called when XMetaL Author starts up; the first document is opened in XMetaL Author; a different document becomes the active document in XMetaL Author; the last open document is closed in XMetaL Author; the selection moves to a different element; a command is executed; or the first character is typed into an element." hide="true"><![CDATA[

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnUpdateUI();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnViewChange();
  }
  ditaDoc = null;

]]></MACRO>

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

  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.OnAfterSetAttributeFromAI();
  }
  ditaDoc = null;

]]></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="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="ShiftEnterKeyOverride" lang="JScript" key="Shift+Enter" desc="Make paragraph" hide="true"><![CDATA[

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

]]></MACRO>

<MACRO name="EnterKeyOverride" lang="JScript" key="Enter" desc="Type split" hide="true"><![CDATA[

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

]]></MACRO>

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

  // DITA.REFACTOR.TODO - Intentionally turned OFF shortcut key='Tab' because of poor
  //    performance in Tables and Lists...see PROD00024539
  // DITA.REFACTOR.TODO - Change macro name to "__XM_DITA_ENTERKEYOVERRIDE__" + TBR stuff
  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.doTabKey();
  }
  ditaDoc = null;

]]></MACRO>

<MACRO name="Index Marker" lang="JScript" key="Alt+Shift+M" desc="Insert index marker" hide="true"><![CDATA[
  
  // DITA.REFACTOR.TODO - Change macro name to "__XM_DITA_INDEXMARKER__" + TBR stuff
  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.doIndexMarker();
  }
  ditaDoc = null;

]]></MACRO>

<MACRO name="ToggleBold" lang="JScript" key="Ctrl+B" desc="Apply Bold" hide="true"><![CDATA[

  // DITA.REFACTOR.TODO - Change macro name to "__XM_DITA_TOGGLEBOLD__" + TBR stuff
  // DITA.REFACTOR.TODO - Use class attribute
  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.doToggleInline("b");
  }
  ditaDoc = null;

]]></MACRO>

<MACRO name="ToggleItalic" lang="JScript" key="Ctrl+I" desc="Apply Italic" hide="true"><![CDATA[

  // DITA.REFACTOR.TODO - Change macro name to "__XM_DITA_TOGGLEITALIC__" + TBR stuff
  // DITA.REFACTOR.TODO - Use class attribute
  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.doToggleInline("i");
  }
  ditaDoc = null;

]]></MACRO>

<MACRO name="ToggleUnderline" lang="JScript" key="Ctrl+U" desc="Apply Underline" hide="true"><![CDATA[

  // DITA.REFACTOR.TODO - Change macro name to "__XM_DITA_TOGGLEUNDERLINE__" + TBR stuff
  // DITA.REFACTOR.TODO - Use class attribute
  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.doToggleInline("u");
  }
  ditaDoc = null;

]]></MACRO>

<MACRO name="ToggleOverline" lang="JScript" key="Ctrl+Shift+U" desc="Apply Overline" hide="true"><![CDATA[

  // DITA.REFACTOR.TODO - Change macro name to "__XM_DITA_TOGGLEOVERLINE__" + TBR stuff
  // DITA.REFACTOR.TODO - Use class attribute
  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.doToggleInline("overline");
  }
  ditaDoc = null;

]]></MACRO>

<MACRO name="ToggleLineThrough" lang="JScript" key="Ctrl+L" desc="Apply Line Through" hide="true"><![CDATA[

  // DITA.REFACTOR.TODO - Change macro name to "__XM_DITA_TOGGLELINETHROUGH__" + TBR stuff
  // DITA.REFACTOR.TODO - Use class attribute
  var ditaDoc = __XM_DITA_GetDitaDocHandler__();
  if (ditaDoc) {
    ditaDoc.doToggleInline("line-through");
  }
  ditaDoc = null;

]]></MACRO>

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

  // If this Ctrl+G runs, print the 'active' map editor instance
  // provided there is one...
  var ditaApp  = __XM_DITA_GetDitaAppHandler__();
  if (ditaApp) {
    ditaApp._generateOutputForActiveMap();
  }
  
  ditaApp = 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>
