
//---------------------------------------------------------
// 全角・半角変換 機能追加スクリプト
//
// 2005/2/26 Kazuhiko Arase
//
// String に、以下のメソッドを拡張します。
//
// ・半角Ascii変換
// toHankakuAscii()
//
// ・全角Ascii変換
// toZenkakuAscii()
//
// ・半角カナ変換
// toHankakuKana()
//
// ・全角カナ変換
// toZenkakuKana()
//
// ・半角変換
// toHankaku()
//
// ・全角変換
// toZenkaku()
//
// ・標準変換(半角Ascii, 全角カナ)
// toNormal()
//

function InstallZenHanConversion() {

    function ConversionMap() {
        this.map1 = {};
        this.map2 = {};
    }

    ConversionMap.prototype = {

        add : function(s1, s2) {

            if (!this.map1[s1]) {
                this.map1[s1] = s2;
            }

            if (!this.map2[s2]) {
                this.map2[s2] = s1;
            }
        },

        convert : function(s, reverse) {

            var map = !reverse? this.map1 : this.map2;

            var converted = "";

            for (var i = 0;i < s.length;i++) {

                if (i + 1 < s.length) {
                    var c = map[s.substring(i, i + 2)];
                    if (c) {
                        converted += c;
                        i++;
                        continue;
                    }
                }

                var c = map[s.substring(i, i + 1)];
                if (c) {
                    converted += c;
                    continue;
                }

                // 変換テーブルに該当無し
                converted += s.substring(i, i + 1);
            }

            return converted;
        }
    };

    //---------------------------------------------------------
    // 全角-半角 マッピング (ASCII)
    //

    var asciiMap = new ConversionMap();

    asciiMap.add(" ", "　");
    asciiMap.add("!", "！");

    // 2重引用符
    //asciiMap.add("\"", "＂");
    asciiMap.add("\"", "“");
    asciiMap.add("\"", "”");

    asciiMap.add("#", "＃");
    asciiMap.add("$", "＄");
    asciiMap.add("%", "％");
    asciiMap.add("&", "＆");
    asciiMap.add("'", "’");
    asciiMap.add("(", "（");
    asciiMap.add(")", "）");
    asciiMap.add("*", "＊");
    asciiMap.add("+", "＋");
    asciiMap.add(",", "，");
    asciiMap.add("-", "−");
    asciiMap.add(".", "．");
    asciiMap.add("/", "／");
    asciiMap.add("0", "０");
    asciiMap.add("1", "１");
    asciiMap.add("2", "２");
    asciiMap.add("3", "３");
    asciiMap.add("4", "４");
    asciiMap.add("5", "５");
    asciiMap.add("6", "６");
    asciiMap.add("7", "７");
    asciiMap.add("8", "８");
    asciiMap.add("9", "９");
    asciiMap.add(":", "：");
    asciiMap.add(";", "；");
    asciiMap.add("<", "＜");
    asciiMap.add("=", "＝");
    asciiMap.add(">", "＞");
    asciiMap.add("?", "？");
    asciiMap.add("@", "＠");
    asciiMap.add("A", "Ａ");
    asciiMap.add("B", "Ｂ");
    asciiMap.add("C", "Ｃ");
    asciiMap.add("D", "Ｄ");
    asciiMap.add("E", "Ｅ");
    asciiMap.add("F", "Ｆ");
    asciiMap.add("G", "Ｇ");
    asciiMap.add("H", "Ｈ");
    asciiMap.add("I", "Ｉ");
    asciiMap.add("J", "Ｊ");
    asciiMap.add("K", "Ｋ");
    asciiMap.add("L", "Ｌ");
    asciiMap.add("M", "Ｍ");
    asciiMap.add("N", "Ｎ");
    asciiMap.add("O", "Ｏ");
    asciiMap.add("P", "Ｐ");
    asciiMap.add("Q", "Ｑ");
    asciiMap.add("R", "Ｒ");
    asciiMap.add("S", "Ｓ");
    asciiMap.add("T", "Ｔ");
    asciiMap.add("U", "Ｕ");
    asciiMap.add("V", "Ｖ");
    asciiMap.add("W", "Ｗ");
    asciiMap.add("X", "Ｘ");
    asciiMap.add("Y", "Ｙ");
    asciiMap.add("Z", "Ｚ");
    asciiMap.add("[", "［");

    // 円記号
    //asciiMap.add("\\", "＼");
    asciiMap.add("\\", "￥");

    asciiMap.add("]", "］");
    asciiMap.add("^", "＾");
    asciiMap.add("_", "＿");

    // 単一引用符
    //asciiMap.add("`", "＇");
    asciiMap.add("`", "‘");
    asciiMap.add("`", "’");

    asciiMap.add("a", "ａ");
    asciiMap.add("b", "ｂ");
    asciiMap.add("c", "ｃ");
    asciiMap.add("d", "ｄ");
    asciiMap.add("e", "ｅ");
    asciiMap.add("f", "ｆ");
    asciiMap.add("g", "ｇ");
    asciiMap.add("h", "ｈ");
    asciiMap.add("i", "ｉ");
    asciiMap.add("j", "ｊ");
    asciiMap.add("k", "ｋ");
    asciiMap.add("l", "ｌ");
    asciiMap.add("m", "ｍ");
    asciiMap.add("n", "ｎ");
    asciiMap.add("o", "ｏ");
    asciiMap.add("p", "ｐ");
    asciiMap.add("q", "ｑ");
    asciiMap.add("r", "ｒ");
    asciiMap.add("s", "ｓ");
    asciiMap.add("t", "ｔ");
    asciiMap.add("u", "ｕ");
    asciiMap.add("v", "ｖ");
    asciiMap.add("w", "ｗ");
    asciiMap.add("x", "ｘ");
    asciiMap.add("y", "ｙ");
    asciiMap.add("z", "ｚ");
    asciiMap.add("{", "｛");
    asciiMap.add("|", "｜");
    asciiMap.add("}", "｝");
    asciiMap.add("~", "～");


    //---------------------------------------------------------
    // 全角-半角 マッピング (カタカナ)
    //


    var kanaMap = new ConversionMap();

    kanaMap.add("。", "。");
    kanaMap.add("「", "「");
    kanaMap.add("」", "」");
    kanaMap.add("、", "、");
    kanaMap.add("・", "・");
    kanaMap.add("ヲ", "ヲ");

    kanaMap.add("ァ", "ァ");
    kanaMap.add("ィ", "ィ");
    kanaMap.add("ゥ", "ゥ");
    kanaMap.add("ェ", "ェ");
    kanaMap.add("ォ", "ォ");

    kanaMap.add("ャ", "ャ");
    kanaMap.add("ュ", "ュ");
    kanaMap.add("ョ", "ョ");

    kanaMap.add("ッ", "ッ");

    kanaMap.add("ー", "ー");

    kanaMap.add("ア", "ア");
    kanaMap.add("イ", "イ");
    kanaMap.add("ウ", "ウ");
    kanaMap.add("エ", "エ");
    kanaMap.add("オ", "オ");

    kanaMap.add("カ", "カ");
    kanaMap.add("キ", "キ");
    kanaMap.add("ク", "ク");
    kanaMap.add("ケ", "ケ");
    kanaMap.add("コ", "コ");

    kanaMap.add("ガ", "ガ");
    kanaMap.add("ギ", "ギ");
    kanaMap.add("グ", "グ");
    kanaMap.add("ゲ", "ゲ");
    kanaMap.add("ゴ", "ゴ");

    kanaMap.add("サ", "サ");
    kanaMap.add("シ", "シ");
    kanaMap.add("ス", "ス");
    kanaMap.add("セ", "セ");
    kanaMap.add("ソ", "ソ");

    kanaMap.add("ザ", "ザ");
    kanaMap.add("ジ", "ジ");
    kanaMap.add("ズ", "ズ");
    kanaMap.add("ゼ", "ゼ");
    kanaMap.add("ゾ", "ゾ");

    kanaMap.add("タ", "タ");
    kanaMap.add("チ", "チ");
    kanaMap.add("ツ", "ツ");
    kanaMap.add("テ", "テ");
    kanaMap.add("ト", "ト");

    kanaMap.add("ダ", "ダ");
    kanaMap.add("ヂ", "ヂ");
    kanaMap.add("ヅ", "ヅ");
    kanaMap.add("デ", "デ");
    kanaMap.add("ド", "ド");

    kanaMap.add("ナ", "ナ");
    kanaMap.add("ニ", "ニ");
    kanaMap.add("ヌ", "ヌ");
    kanaMap.add("ネ", "ネ");
    kanaMap.add("ノ", "ノ");

    kanaMap.add("ハ", "ハ");
    kanaMap.add("ヒ", "ヒ");
    kanaMap.add("フ", "フ");
    kanaMap.add("ヘ", "ヘ");
    kanaMap.add("ホ", "ホ");

    kanaMap.add("バ", "バ");
    kanaMap.add("ビ", "ビ");
    kanaMap.add("ブ", "ブ");
    kanaMap.add("ベ", "ベ");
    kanaMap.add("ボ", "ボ");

    kanaMap.add("パ", "パ");
    kanaMap.add("ピ", "ピ");
    kanaMap.add("プ", "プ");
    kanaMap.add("ペ", "ペ");
    kanaMap.add("ポ", "ポ");

    kanaMap.add("マ", "マ");
    kanaMap.add("ミ", "ミ");
    kanaMap.add("ム", "ム");
    kanaMap.add("メ", "メ");
    kanaMap.add("モ", "モ");

    kanaMap.add("ヤ", "ヤ");
    kanaMap.add("ユ", "ユ");
    kanaMap.add("ヨ", "ヨ");

    kanaMap.add("ラ", "ラ");
    kanaMap.add("リ", "リ");
    kanaMap.add("ル", "ル");
    kanaMap.add("レ", "レ");
    kanaMap.add("ロ", "ロ");

    kanaMap.add("ワ", "ワ");
    kanaMap.add("ン", "ン");

    kanaMap.add("ヴ", "ヴ");


    kanaMap.add("゛", "゛");
    kanaMap.add("゜", "゜");

    kanaMap.add("ヰ", "イ");
    kanaMap.add("ヱ", "エ");
    kanaMap.add("ヮ", "ワ");
    kanaMap.add("ヵ", "カ");
    kanaMap.add("ヶ", "ケ");



    String.prototype.toHankakuAscii = function() {
        return asciiMap.convert(this, true);
    }

    String.prototype.toZenkakuAscii = function() {
        return asciiMap.convert(this, false);
    }

    String.prototype.toHankakuKana = function() {
        return kanaMap.convert(this, false);
    }

    String.prototype.toZenkakuKana = function() {
        return kanaMap.convert(this, true);
    }

    String.prototype.toHankaku = function() {
        return this.toHankakuKana().toHankakuAscii();
    }

    String.prototype.toZenkaku = function() {
        return this.toZenkakuKana().toZenkakuAscii();
    }

    String.prototype.toNormal = function() {
        return this.toZenkakuKana().toHankakuAscii();
    }
}

// 機能インストール
InstallZenHanConversion();



