
    /* /_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
    charset = utf-8
    LastModified : 2007-02/24

    作者：takamax

    +++ Ajax ツール +++

    Ａｊａｘを実現する手助けに使用することができる。
    使用方法は以下に示す。


    <-- 動作ブラウザ -->
    未テスト


    <-- 使い方 -->
    ajax_instance = ajax.create()
        Ajax通信を行なうためのインスタンスを生成します。引数にはサーバからの
        応答に反応する関数を指定します。

    ajax.post()
        Ajax通信を行なうためのインスタンスを生成します。引数にはサーバからの
        応答に反応する関数を指定します。
        ajax_instanceが作成されていることが前提です。

    ajax.get()
        Ajax通信を行なうためのインスタンスを生成します。引数にはサーバからの
        応答に反応する関数を指定します。
        ajax_instanceが作成されていることが前提です。

    エラーコード
    -1      パラメータエラー

    /_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/*/
ajax = new function() {

    /*
     * 関数名：createAjax
     *  @param  _func   データ受信後に動作する関数
     *  @param  _type   受信するデータの型
     *                  xml     ->  ＸＭＬ型にパースします
     *                  html    ->  ＨＴＭＬ型にパースします
     *                  上記以外    ->  テキスト型にパースします
     *  @param  _debug  デバッグ用にデータを出力する時に使用します
     *  @return     ajaxオブジェクト
     * 使用条件
     */
    this.createAjax = function(_func, _type, _debug) {

        if (_func == null)
            throw new Error(-1, "The parameter is illegal.\nThe parameter should be a function.");

        var http = null;
        if (window.ActiveXObject) {
            try {
                http = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e1) {
                try {
                    http = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e2) {
                    throw new Error(-9, "");
                }
             }
        } else if (window.XMLHttpRequest) {
            try {
                http = new XMLHttpRequest();
            } catch(e) {
                throw new Error(-9, "");
            }
        } else {
            throw new Error(-9, "");
        }
        if (_func) {
            http.onreadystatechange = function() {

                if (http.readyState == 4 && http.status == 200) {

                    if (_debug) alert(http.responseText);
                    if (_type == "xml") {
                        _func(http.responseXML);
                    } else if (_type == "html") {
                        var resp = document.createElement("resp");
                        resp.innerHTML = http.responseText;
                        _func(resp);
                    } else {
                        _func(http.responseText);
                    }
                }
            };
        }
        return http;
    }


    /*
     * 関数名：post
     *  @param  _ajax   createAjaxで作成したオブジェクト
     *  @param  _path   送信先のＵＲＬ
     *  @param  _hash   送信するデータ
     * 使用条件
     */
    this.post = function(_ajax, _path, _hash) {

        var del = "";
        var str = "";

        for(var i in _hash) {
            str = str + del + i + "=" + utf8(_hash[i]);
            del = "&";
        }

        _ajax.open("POST", _path, true);
        _ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charser=uft-8");
        _ajax.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");
        _ajax.send(str);
    }


    /*
     * 関数名：post
     *  @param  _ajax   createAjaxで作成したオブジェクト
     *  @param  _path   送信先のＵＲＬ
     *  @param  _hash   送信するデータ
     * 使用条件
     */
    this.get = function(_ajax, _path, _hash) {

        var del = "";
        var str = "";

        for(var i in _hash) {
            str = str + del + i + "=" + utf8(_hash[i]);
            del = "&";
        }

        _ajax.open("GET", _path, true);
        _ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charser=uft-8");
        _ajax.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");
        _ajax.send(str);
    }

    /*
     *  関数名：utf8
     *  @param  _utf16  Unicode文字列
     * 使用条件
     */
    function utf8(_utf16) {

        if (_utf16 == null) return "";

        return _utf16.replace(/([^a-zA-Z0-9_\-\.])/g, function(_tmp) {

            if (_tmp == "\x20") return "+";

            var i=0;
            var utf8 = [];
            var out = "";
            var c = _tmp.charCodeAt(0);

            if (c <= 0x7f) {
                utf8[i++] = c;
            } else if (c <= 0x7ff) {
                utf8[i++] = 0xc0 | ((c >>  6) & 0x1F);
                utf8[i++] = 0x80 | ((c >>  0) & 0x3F);
            } else if (c <= 0xffff) {
                utf8[i++] = 0xe0 | ((c >> 12) & 0x0F);
                utf8[i++] = 0x80 | ((c >>  6) & 0x3F);
                utf8[i++] = 0x80 | ((c >>  0) & 0x3F);
            } else {
                var j = 4;
                while (c >> (6 * j)) j++;
                utf8[i++] = ((0xff00 >>> j) & 0xff) | (c >>> (6 * --j));
                while (j--)
                utf8[i++] = 0x80 | ((c >>> (6 * j)) & 0x3f);
            }
            out = "";
            for(var j in utf8) {
                var t = utf8[j];
                out += "%" + utf8[j].toString(16);
            }
            return out.toUpperCase();
        });
    }
}
