/**
 * AProtocol ver1.0
 *
 * 受信クラスのみ実装している
 * 
 */

/**
 * namespaceの定義
 */
PadPlate.namespace('net');

(function(){

    // 必要なライブラリがあるかどうか調べる
    if( typeof YAHOO == 'undefined' || typeof YAHOO.util == 'undefined' || typeof YAHOO.util.Connect == 'undefined' ||
        typeof YAHOO.lang == 'undefined' || typeof YAHOO.lang.JSON == 'undefined'
    ){
        // なかったらLoaderクラスで読み込む
        new PadPlate.util.Loader({
            require: ["json","connection"], // what to load
            onSuccess: function(o) {
                YAHOO.util.Event.onDOMReady(function(){
                   install();
                }); 
            }
        });
    }else{
        install();
    }
    
    /**
     * インストール
     */
    function install(){
        installAResponse();
        installConnect();
    }

    /**
     * AResponseクラスのインストール
     */
    function installAResponse(){
        var JSON = YAHOO.lang.JSON;
        /**
         * @class AResponse
         */
        PadPlate.net.AResponse = function(json){
            this.initialize.apply(this, arguments);
        };
        PadPlate.net.AResponse.STATUS = {
            /**
             * レスポンスの状態が成功の場合の定数
             */
            SUCCESS: 'success',
            /**
             * レスポンスの状態が失敗の場合の定数
             */
            FAILURE: 'failure'
        };
        PadPlate.net.AResponse.prototype = {
            
            /**
             * 結果オブジェクト
             * @property _result
             */
            _result: null,
            
            /**
             * レスポンスの状態
             * @property _status
             */
            _status: null,
            /**
             * プロトコルのバージョン
             * @property _version
             */
            _version: 1.0,
            /**
             * HttpRequestObject
             * XmlHttpRequestの結果オブジェクトと同じ
             * @property _httpObj
             */
            _httpObj: null,
            /**
             * コンストラクタ
             *
             * @method initialize
             * @param {string|object} AResponseのJSON形式の文字列かJSONオブジェクト 
             */
            initialize: function(_httpObj){
                var json = _httpObj.responseText;
                try{
                    // 文字列の場合はJSON形式としてエンコードする
                    var jsonObj = json;
                    if(typeof json == 'string'){
                        jsonObj = JSON.parse(json);
                    }
                }catch(e){
                    alert('無効なJSONデータです');
                    return;
                }
                
                if(!this.validate(jsonObj)){
                    alert('無効な受信データです');
                    return;
                }

                this._status = jsonObj.status;
                this._result = jsonObj.result;
            },
            /**
             * 渡されたデータが有効かチェックする
             * 
             * @method validate
             * @param {object} AResponseオブジェクト
             * @return bool
             */
            validate: function(target){
                // @todo 実装する！
                return true;
            },
            getStatus: function(){
                return this._status;
            },
            getResult: function(){
                return this._result;
            },
            getHttpResponse: function(){
                return this._httpObj;
            }
        };
    }
    /**
     * PadPlate.net.Connectクラスのインストール
     *
     * YAHOO.util.Connectのラッパークラスのインストール
     */
    function installConnect(){
        // クラス内で使用するクラスのショートカット
        var C = YAHOO.util.Connect;
        var R = PadPlate.net.AResponse;
        /**
         * @class Connect
         */
        PadPlate.net.Connect = {
            /**
             * @method asyncRequest
             * @description callbacksのsuccessプロパティに成功したときのコールバック関数を、failureに失敗したときのコールバック関数を記述する
             * @static
             * @public
             * @param method POSTかGETを渡す
             * @param url リクエストするURL
             * @param params 送信する値の連想配列
             * @param callbacks コールバック関数群
             * @return void
             */
            asyncRequest: function(method, url, callbacks, params){
                if(typeof callbacks.failure == 'function')
                    callbacks.failure = function(r){ alert(r.getResult(), 'エラー'); };
                
                C.asyncRequest( method, url, {
                    success: function(httpObj){
                        var r = new R(httpObj);
                        
                        if(r.getStatus() != R.STATUS.SUCCESS){
                            callbacks.failure(r);
                            return;
                        }
                        
                        if(typeof callbacks.success == 'function'){
                            callbacks.success(r);
                            return;
                        }
                    }
                }, params);
            }
        };
    }
}());