/**
 * 非同期通信(Ajax)を行うクラス
 *
 * @example シングルアクション
 * 通常の非同期通信
 *
 * var jdo = new JDO(resource<Object>);
 * jdo.prepare(json<String>, callback_func<Function>);
 * jdo.execute();
 *
 *
 * @example キュー管理アクション
 * 前の通信が完了後、次の通信を行うキュー管理通信
 *
 * var jdo = new JDO(resource<Object>);
 * jdo.prepare_q(json1<String>, callback_func1<Function>);
 * jdo.prepare_q(json2<String>, callback_func2<Function>);
 * jdo.prepare_q(json3<String>, callback_func3<Function>);
 * jdo.execute();
 *
 *
 * @param resource<Object> Ajax処理に必要な設定値
 *
 * @author Yugo Kimura
 * @version 1.0
 *
 */
var JDO = (function(obj){
	var context = this;
	
	context.property = {};
	context.queue = [];
	
	if(obj != undefined && typeof obj == 'object') context.setProperty(obj);
});

/**
 * 共通設定項目
 * 現在使用無し
 */
JDO.prototype.common = (function(){
	return {
		transaction : false
	}
});

/**
 * JDOインスタンスの指定したプロパティーを書き換える
 *
 * @param property<Object> キーと値を指定したプロパティ値を書き換え
 *
 */
JDO.prototype.setProperty = (function(obj){
	if(typeof obj =='object') for(var key in obj) this.property[key] = obj[key];
});

/**
 * JDOインスタンスにサーバにリクエストするデータをセットする
 * シングルリクエストモードでのみ利用する
 *
 * @param json<String> リクエストするJSONを投げる
 */
JDO.prototype.query = (function(param){
	this.property.data = param;
});

/**
 * JDOインスタンスにコールバック関数をセットする
 * セットの方法は以下のように二つ存在する
 *
 * パターン1 : JSONパラメータを同時に指定する場合
 * @example
 * prepare(json<String>, callback_func<Function>)
 * 
 * @param json<String>
 * @param callback_func<Function>
 *
 * パターン2 : JSONパラメータが指定済みの場合
 * @example
 * prepare(callback_func<Function>)
 * 
 * @param callback_func<Function>
 */
JDO.prototype.prepare = (function(func_or_param, func){
	switch(typeof func_or_param){
		case 'string' :
			this.property.data = func_or_param;
			this.property.success = func;
		break;
		case 'function' :
			this.property.success = func_or_param;
		break;
	}
});

/**
 * 輻輳する通信(同時通信)の際に、キュー管理しながら通信するメソッド
 * execute()前に複数のprepare_qする事が可能
 *
 * @param json<String> JSONパラメータ
 * @param callback_func<Function> コールバックされる関数
 *
 */
JDO.prototype.prepare_q = (function(param_json, func_callback){
	this.queue.push({param : param_json, func : func_callback});
});


/**
 * 通信を実行するメソッド
 * prepare、prepare_qしたパラメータで指定したサーバに非同期の通信
 * を行う
 *
 */
JDO.prototype.execute = (function(){
	if(this.queue.length > 0){
		var context = this;
		context._looper = function(){
			var obj = context.queue.shift();
			this.property.success = obj.func;
			this.property.complete = function(){
				if(context.queue.length > 0) setTimeout(function(){context._looper()});
			}
			this.property.data = obj.param;
			$.ajax(context.property);
		}
		context._looper();
	}else{
		$.ajax(this.property);
	}
});
