/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */

/**
 * インストールする拡張
 */
var Extension = {
  /* String  バージョン */
  version        : "5.4.3",
  /* String  ダイアログに表示する名前 */
  displayName    : "UnMHT",
  /* String  拡張の識別名 */
  appName        : "unmht",
  /* String  拡張の作者 */
  author         : "arai",
  /* Array  インストールする components のリスト
   *   [String ファイル名, ...] */
  componentsList : [
    "arUnMHTDocumentLoaderFactory.js",
    "arUnMHTStartupObserver.js",
    "arUnMHTContentPolicy.js",
    "arUnMHTMhtmlProtocolHandler.js",
    "arUnMHTProtocolHandler.js",
    "arIUnMHTProtocolHandler.xpt"
    ],
  /* Array  前回インストールしたもののうち、削除する components のリスト
   *   [String ファイル名, ...] */
  uninstallList  : [
    ],
  /* Array  インストールする locale のリスト
   *   [String ロケール名, ...] */
  localesList    : [
    "cs-CZ",
    "de-DE",
    "en-GB",
    "es-ES",
    "fr-FR",
    "hu-HU",
    "it-IT",
    "ja-JP",
    "pl-PL",
    "pt-BR",
    "ru-RU",
    "uk-UA",
    "tr-TR",
    "vi-VN",
    "zh-CN",
    "zh-TW",
        
    "en-US"
    ]
};

/**
 * インストール対象の情報
 *
 * @param  Object Extension
 *         インストールする拡張
 * @param  Boolean global
 *         Global ならば true
 *         Profile ならば false
 */
function arSettings (Extension, global) {
  if (global) {
    this.chrome = getFolder ("chrome");
    this.flag   = DELAYED_CHROME;
  }
  else {
    this.chrome = getFolder ("Profile", "chrome");
    this.flag   = PROFILE_CHROME;
  }
  this.components = getFolder ("components");
  this.jarPath    = getFolder (this.chrome, Extension.appName + ".jar");
  this.exists     = File.exists (this.jarPath);
}
arSettings.prototype = {
  chrome : "",     /* String  chrome のパス */
  components : "", /* String  components のパス */
  flag : 0,        /* Number  インストール時のフラグ */
  jarPath : "",    /* String  jar のパス */
  exists : false   /* Boolean  jar が存在するかどうか */
};

/**
 * インストーラ
 *
 * @param  Object Extension
 *         インストールする拡張
 */
function arInstaller (Extension) {
  this.init (Extension);
}

arInstaller.prototype = {
  extension : null, /* Object  インストールする拡張 */
  global : null,    /* arSettings  Global インストールの設定 */
  profile : null,   /* arSettings  Profile インストールの設定 */
    
  /**
   * 初期化
   *
   * @param  Object Extension
   *         インストールする拡張
   */
  init : function (Extension) {
    this.extension = Extension;
    this.global = new arSettings (Extension, true);
    this.profile = new arSettings (Extension, false);
  },
    
  /**
   * 不要なファイルを削除する
   */
  uninstall : function () {
    var i;
    var err;
    var oldFile;
        
    if (buildID <= 2003072300) {
      /* Wazilla 等では全てのファイルを削除してからでないとインストールできない
       * また、一旦移動してからでないと削除できない */
            
      /* 移動 */
      initInstall ("uninstall_old",
                   "/" + this.extension.author + "/uninstall_old",
                   "0.0");
      if (this.global.exists) {
        File.rename (this.global.jarPath,
                     this.extension.appName
                     + "_uninstalled");
      }
      if (this.profile.exists) {
        File.rename (this.profile.jarPath,
                     this.extension.appName
                     + "_uninstalled");
      }
      for (i = 0; i < this.extension.uninstallList.length; i ++) {
        oldFile = getFolder (this.global.components,
                             this.extension.uninstallList [i]);
        if (File.exists (oldFile)) {
          File.rename (oldFile,
                       this.extension.appName
                       + "_uninstalled2_" + i);
        }
        oldFile = getFolder (this.profile.chrome,
                             this.extension.uninstallList [i]);
        if (File.exists (oldFile)) {
          File.rename (oldFile,
                       this.extension.appName
                       + "_uninstalled2_" + i);
        }
      }
      for (i = 0; i < this.extension.componentsList.length; i ++) {
        oldFile = getFolder (this.global.components,
                             this.extension.componentsList [i]);
        if (File.exists (oldFile)) {
          File.rename (oldFile,
                       this.extension.appName
                       + "_uninstalled_" + i);
        }
        oldFile = getFolder (this.profile.chrome,
                             this.extension.componentsList [i]);
        if (File.exists (oldFile)) {
          File.rename (oldFile,
                       this.extension.appName
                       + "_uninstalled_" + i);
        }
      }
      err = getLastError ();
      if (err == SUCCESS) {
        var err = performInstall ();
        if (err == SUCCESS) {
          cancelInstall (err);
        }
      }
      else {
        cancelInstall (err);
      }
    
      /* 削除 */
      initInstall ("uninstall_old",
                   "/" + this.extension.author + "/uninstall_old",
                   "0.1");
      if (this.global.exists) {
        File.remove (getFolder (this.global.chrome,
                                this.extension.appName
                                + "_uninstalled"));
      }
      if (this.profile.exists) {
        File.remove (getFolder (this.profile.chrome,
                                this.extension.appName
                                + "_uninstalled"));
      }
      for (i = 0; i < this.extension.uninstallList.length; i ++) {
        oldFile = getFolder (this.global.components,
                             this.extension.appName
                             + "_uninstalled2_" + i);
        if (File.exists (oldFile)) {
          File.remove (oldFile);
        }
        oldFile = getFolder (this.profile.chrome,
                             this.extension.appName
                             + "_uninstalled2_" + i);
        if (File.exists (oldFile)) {
          File.remove (oldFile);
        }
      }
      for (i = 0; i < this.extension.componentsList.length; i ++) {
        oldFile = getFolder (this.global.components,
                             this.extension.appName
                             + "_uninstalled_" + i);
        if (File.exists (oldFile)) {
          File.remove (oldFile);
        }
        oldFile = getFolder (this.profile.chrome,
                             this.extension.appName
                             + "_uninstalled_" + i);
        if (File.exists (oldFile)) {
          File.remove (oldFile);
        }
      }
      err = getLastError ();
      if (err == SUCCESS) {
        var err = performInstall ();
        if (err == SUCCESS) {
          cancelInstall (err);
        }
      }
      else {
        cancelInstall (err);
      }
    }
    else {
      /* Wazilla 以外では不要になったファイルのみ削除する */
            
      initInstall ("uninstall_old",
                   "/" + this.extension.author + "/uninstall_old",
                   "0.0");
      for (i = 0; i < this.extension.uninstallList.length; i ++) {
        oldFile = getFolder (this.global.components,
                             this.extension.uninstallList [i]);
        if (File.exists (oldFile)) {
          File.remove (oldFile);
        }
        oldFile = getFolder (this.profile.chrome,
                             this.extension.uninstallList [i]);
        if (File.exists (oldFile)) {
          File.remove (oldFile);
        }
      }
      err = getLastError ();
      if (err == SUCCESS) {
        var err = performInstall ();
        if (err == SUCCESS) {
          cancelInstall (err);
        }
      }
      else {
        cancelInstall (err);
      }
    }
  },
    
  /**
   * インストール先を取得する
   */
  getTarget : function () {
    this.target = this.global;
  },
    
  /**
   * インストールする
   */
  install : function () {
    var i;
    initInstall (this.extension.displayName
                 + " " + this.extension.version,
                 "/" + this.extension.author
                 + "/" + this.extension.appName,
                 this.extension.version);
        
    /* components のインストール */
    for (i = 0; i < this.extension.componentsList.length; i ++) {
      addFile (null,
               "components/" + this.extension.componentsList [i],
               this.global.components, null);
    }
        
    /* jar のインストール */
    addFile ("/" + this.extension.author
             + "/" + this.extension.appName,
             this.extension.version,
             "chrome/" + this.extension.appName + ".jar",
             this.target.chrome,
             null);
    registerChrome (CONTENT | this.target.flag,
                    this.target.jarPath,
                    "content/");
        
    /* locale のインストール */
    for (i = 0; i < this.extension.localesList.length; i ++) {
      var locale = this.extension.localesList [i];
      registerChrome (LOCALE | this.target.flag,
                      this.target.jarPath,
                      "locale/" + locale +"/");
    }

    var err;
    err = getLastError ();
    if (err == SUCCESS) {
      err = performInstall ();
      if (err == SUCCESS || err == 999) {
      }
      else {
        cancelInstall (err);
      }
    }
    else {
      cancelInstall (err);
    }
  }
};

var installer = new arInstaller (Extension);
installer.uninstall ();
installer.getTarget ();
installer.install ();
