<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

  <?define ProductName = "Node.js" ?>
  <?define ProductDescription = "Node.js" ?>
  <?define ProductAuthor = "Joyent, Inc. and other Node contributors" ?>

  <?define RegistryKeyPath = "SOFTWARE\Node.js" ?>

  <?define RepoDir="$(var.ProjectDir)..\..\..\" ?>
  <?define SourceDir="$(var.RepoDir)\$(var.Configuration)\" ?>

  <Product Id="*"
           Name="$(var.ProductName)"
           Language="1033"
           Version="$(var.ProductVersion)"
           Manufacturer="$(var.ProductAuthor)"
           UpgradeCode="1d60944c-b9ce-4a71-a7c0-0384eb884baa">

    <Package InstallerVersion="200" Compressed="yes"/>

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes"/>

    <MajorUpgrade AllowSameVersionUpgrades="yes"
                  DowngradeErrorMessage="A later version of node.js is already installed. Setup will now exit."/>

    <Icon Id="NodeIcon" SourceFile="$(var.RepoDir)\src\res\node.ico"/>
    <Property Id="ARPPRODUCTICON" Value="NodeIcon"/>
    <Property Id="ApplicationFolderName" Value="nodejs"/>
    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"/>

    <Property Id="INSTALLDIR">
      <RegistrySearch Id="InstallPathRegistry"
                      Type="raw"
                      Root="HKCU"
                      Key="$(var.RegistryKeyPath)"
                      Name="InstallPath"/>
    </Property>

    <Feature Id="NodeRuntime"
             Level="1"
             Title="Node.js runtime"
             Description="Install the core Node.js runtime (node.exe)."
             Absent="disallow">
      <ComponentRef Id="NodeExecutable"/>
      <ComponentRef Id="NodeVarsScript"/>
      <ComponentRef Id="NodeStartMenuAndRegistryEntries"/>
      <ComponentGroupRef Id="Product.Generated"/>

      <Feature Id="NodePerfCtrSupport"
               Level="1"
               Title="Performance counters"
               Description="Installs support for Node.js-specific performance counters.">
        <ComponentRef Id="NodePerfCtrSupport"/>
      </Feature>

      <Feature Id="NodeEtwSupport"
               Level="1"
               Title="Event tracing (ETW)"
               Description="Installs support for event tracing (ETW) events generated by Node.js.">
        <ComponentRef Id="NodeEtwSupport"/>
      </Feature>
    </Feature>

    <Feature Id="npm"
             Level="1"
             Title="npm package manager"
             Description="Install npm, the recommended package manager for Node.js.">
      <ComponentRef Id="NpmCmdScript"/>
      <ComponentRef Id="NpmBashScript"/>
      <ComponentRef Id="NpmConfigurationFile"/>
      <ComponentGroupRef Id="NpmSourceFiles"/>
    </Feature>

    <Feature Level="1"
             Id="DocumentationShortcuts"
             Title="Online documentation shortcuts"
             Description="Add start menu entries that link the the online documentation for Node.js $(var.ProductVersion) and the Node.js website.">
      <ComponentRef Id="DocumentationShortcuts"/>
    </Feature>

    <Feature Id="EnvironmentPath"
             Level="1"
             Title="Add to PATH"
             Description="Add Node, npm, and modules that were globally installed by npm to the PATH environment variable.">
      <Feature Id="EnvironmentPathNode"
               Level="1"
               Title="Node and npm"
               Description="Add Node and npm (if installed) to the PATH environment variable.">
        <ComponentRef Id="EnvironmentPathNode"/>
      </Feature>

      <Feature Id="EnvironmentPathNpmModules"
               Level="1"
               Title="npm modules"
               Description="Add modules that are installed globally by npm to the PATH environment variable. This option works for the current user only; other users need to update their PATH manually.">
        <ComponentRef Id="EnvironmentPathNpmModules"/>
      </Feature>
    </Feature>

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="Node.js"/>
      </Directory>

      <Directory Id="$(var.ProgramFilesFolderId)">
        <Directory Id="INSTALLDIR" Name="nodejs">
        </Directory>
      </Directory>
    </Directory>

    <DirectoryRef Id="INSTALLDIR">
      <Component Id="NodeExecutable">
        <File Id="node.exe" KeyPath="yes" Source="$(var.SourceDir)\node.exe"/>
      </Component>

      <Component Id="NodeVarsScript">
        <File Id="nodevars.bat" KeyPath="yes" Source="$(var.RepoDir)\tools\msvs\nodevars.bat"/>
      </Component>

      <?if $(var.NoPerfCtr) != 1 ?>
      <Component Id="NodePerfCtrSupport">
        <File Id="node_perfctr_provider_man" Name="node_perfctr_provider.man" Source="$(var.RepoDir)\src\res\node_perfctr_provider.man">
          <util:PerfCounterManifest ResourceFileDirectory="[INSTALLDIR]"/>
        </File>
      </Component>
      <?endif?>

      <?if $(var.NoETW) != 1 ?>
      <Component Id="NodeEtwSupport">
        <File Id="node_etw_provider.man" Source="$(var.RepoDir)\src\res\node_etw_provider.man">
          <util:EventManifest MessageFile="[INSTALLDIR]node.exe" ResourceFile="[INSTALLDIR]node.exe"/>
        </File>
      </Component>
      <?endif?>
    </DirectoryRef>

    <DirectoryRef Id="ApplicationProgramsFolder">
      <Component Id="NodeStartMenuAndRegistryEntries">
        <RegistryValue Root="HKCU"
                       Key="$(var.RegistryKeyPath)"
                       Name="InstallPath"
                       Type="string"
                       Value="[INSTALLDIR]"
                       KeyPath="yes"/>
        <RegistryValue Root="HKCU"
                       Key="$(var.RegistryKeyPath)"
                       Name="Version"
                       Type="string"
                       Value="$(var.ProductVersion)"/>
        <Shortcut Id="NodeVarsScriptShortcut"
                  Name="Node.js command prompt"
                  Target="[%ComSpec]"
                  Arguments='/k "[INSTALLDIR]nodevars.bat"'
                  Show="normal"
                  WorkingDirectory="INSTALLDIR"/>
        <Shortcut Id="NodeExecutableShortcut"
                  Name="Node.js"
                  Target="[INSTALLDIR]node.exe"
                  WorkingDirectory="INSTALLDIR"/>
        <Shortcut Id="UninstallProduct"
                  Name="Uninstall Node.js"
                  Target="[SystemFolder]msiexec.exe"
                  Arguments="/x [ProductCode]"/>
        <RemoveFolder Id="RemoveApplicationProgramsFolder"
                      On="uninstall"/>
      </Component>
    </DirectoryRef>

    <DirectoryRef Id="INSTALLDIR">
      <Component Id="NpmCmdScript">
        <File Id="npm.cmd" KeyPath="yes" Source="$(var.NpmSourceDir)\bin\npm.cmd"/>
      </Component>

      <Component Id="NpmBashScript">
        <File Id="npm.sh" KeyPath="yes" Source="$(var.NpmSourceDir)\bin\npm"/>
      </Component>

      <Directory Id="NodeModulesFolder" Name="node_modules">
        <Directory Id="NpmFolder" Name="npm">
          <Component Id="NpmConfigurationFile">
            <File Id="npm.rc" KeyPath="yes" Source="$(var.RepoDir)\tools\msvs\npm\npmrc"/>
          </Component>
        </Directory>
      </Directory>
    </DirectoryRef>

    <DirectoryRef Id="ApplicationProgramsFolder">
      <Component Id="DocumentationShortcuts">
        <RegistryValue Root="HKCU"
                       Key="$(var.RegistryKeyPath)\Components"
                       Name="DocumentationShortcuts"
                       Type="integer"
                       Value="1"
                       KeyPath="yes"/>
        <util:InternetShortcut Id="WebsiteShortcut"
                               Name="Node.js website"
                               Target="http://nodejs.org"
                               Type="url"/>
        <util:InternetShortcut Id="DocsShortcut"
                               Name="Node.js documentation"
                               Target="http://nodejs.org/dist/v$(var.ProductVersion)/docs/api/"
                               Type="url"/>
      </Component>
    </DirectoryRef>

    <DirectoryRef Id="INSTALLDIR">
      <Component Id="EnvironmentPathNode">
        <RegistryValue Root="HKLM"
                       Key="$(var.RegistryKeyPath)\Components"
                       Name="EnvironmentPathNode"
                       Type="integer"
                       Value="1"
                       KeyPath="yes"/>
        <Environment Id="EnvironmentPathNode"
                     Action="set"
                     Name="PATH"
                     Part="last"
                     System="yes"
                     Value="[INSTALLDIR]"/>
      </Component>

      <Component Id="EnvironmentPathNpmModules">
        <RegistryValue Root="HKCU"
                       Key="$(var.RegistryKeyPath)\Components"
                       Name="EnvironmentPathNpmModules"
                       Type="integer"
                       Value="1"
                       KeyPath="yes"/>
        <Environment Id="EnvironmentPathNpmModules"
                     Action="set"
                     Name="PATH"
                     Part="last"
                     System="no"
                     Value="[AppDataFolder]npm"/>
      </Component>
    </DirectoryRef>

    <UI Id="NodeInstallUI">
      <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8"/>
      <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12"/>
      <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes"/>

      <Property Id="DefaultUIFont" Value="WixUI_Font_Normal"/>
      <Property Id="WixUI_Mode" Value="FeatureTree"/>

      <DialogRef Id="ErrorDlg"/>
      <DialogRef Id="FatalError"/>
      <DialogRef Id="FilesInUse"/>
      <DialogRef Id="MsiRMFilesInUse"/>
      <DialogRef Id="PrepareDlg"/>
      <DialogRef Id="ProgressDlg"/>
      <DialogRef Id="ResumeDlg"/>
      <DialogRef Id="UserExit"/>
      <DialogRef Id="WelcomeDlg"/>
      <DialogRef Id="LicenseAgreementDlg"/>
      <DialogRef Id="InstallDirDlg"/>
      <DialogRef Id="BrowseDlg"/>
      <DialogRef Id="InvalidDirDlg"/>

      <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">NOT Installed</Publish>
      <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>
      <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
      <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg">LicenseAccepted = "1"</Publish>
      <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
      <Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="CustomizeDlg" Order="20">1</Publish>
      <Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="10">1</Publish>
      <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="10">1</Publish>
      <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="20">1</Publish>
      <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
      <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="1">NOT Installed OR WixUI_InstallMode = "Change"</Publish>
      <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>
      <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="3">Installed AND PATCH</Publish>
      <Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="CustomizeDlg">1</Publish>
      <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
      <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
      <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
      <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
      <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="1">Installed</Publish>
      <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg" Order="2">NOT Installed</Publish>
      <Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>

      <Property Id="WIXUI_EXITDIALOGOPTIONALTEXT" Value="Node.js has been successfully installed."/>
    </UI>

    <UIRef Id="WixUI_Common"/>
    <WixVariable Id="WixUIBannerBmp" Value="..\..\..\doc\thin-white-stripe.jpg"/>
    <WixVariable Id="WixUIDialogBmp" Value="..\..\..\doc\full-white-stripe.jpg"/>
    <WixVariable Id="WixUILicenseRtf" Value="$(var.SourceDir)\LICENSE.rtf"/>
  </Product>

</Wix>
