/*
 * effect.js
 * 開かれているファイル全てに同一の効果を適用する.
 * スクリプトのオプションとして連結効果のプリセット名を指定する.
 *
 * 例: foo という名前のプリセットを使うには
 *   effect.js foo
 *
 * options:
 * /selall
 * /suspend
 */

@set @EXIT_SUCCESS = 0
@set @EXIT_FAILURE = 1

var Opt = new struct_options();

main();
exit();

// =======================================================================

// 文字端末にテキストを表示.

function echo(text)
{
    Script.Echo(text);
}

// スクリプトの終了関数. 引数は省略可.

function exit(exit_code)
{
    Script.Quit(exit_code);
}

// スクリプトの使用方法を表示.

function print_usage(error_msg)
{
    echo(Script.ScriptName);
    echo("  preset [/selall] [/suspend]");
    echo();
    echo("  preset    連結効果のプリセット名。");
    echo("  /selall   ファイルの全範囲を選択状態にする。");
    echo("  /suspend  終了後 OS を待機状態にする。");
    echo();
}

// コマンドラインオプションの既定値

function struct_options()
{
    this.SelAll  = false;
    this.Suspend = false;
}

// コマンドラインのオプションからグローバル変数 Opt.XXX を設定する.

function read_options()
{
    var args = Script.Arguments;

    // ヘルプオプションがあれば使用方法を表示して終了.

    if (args.Named.Exists("?")) {
        print_usage();
        exit(@EXIT_FAILURE);
    }

    // 名前付きオプションを調べる.
    var e, key;

    for (e = new Enumerator(args.Named); !e.atEnd(); e.moveNext()) {
        key = e.item().toLowerCase();

        // ファイルの全範囲選択
        if (key == "selall")
            Opt.SelAll = true;

        // 電源コントロール
        else if (key == "suspend")
            Opt.Suspend = true;

        else {
            echo("エラー: 不明なオプション " + e.item());
            exit(@EXIT_FAILURE);
        }
    }

    // 連結効果のプリセット名.

    if (args.Unnamed.length == 0) {
        echo("エラー: プリセット名が指定されていません。");
        exit(@EXIT_FAILURE);
    }
    else if (args.Unnamed.length > 1) {
        echo("エラー: プリセット名は一つだけしか指定できません。");
        exit(@EXIT_FAILURE);
    }
    Opt.PresetName = args.Unnamed(0);
}

function main()
{
    // コマンドライン読み取り
    read_options();

    // 電源コントロール
    if (Opt.Suspend)
        Application.System.SetSuspendState(false, true, false);     // hibernate, force, immediate

    var e, doc;
    for (e = new Enumerator(Application.Documents); !e.atEnd(); e.moveNext()) {
        doc = e.item();
        Script.Echo(doc.Title);
        // 全て選択の場合
        if (Opt.SelAll) {
            doc.SelectionFrom = 0;
            doc.SelectionTo = doc.Length;
        }
        // 効果適用
        doc.EffectChain(Opt.PresetName);
    }

    exit(@EXIT_SUCCESS);
}