/**
 * JavascriptのObjectをJson形式に変換する
 * Objectが渡されたない場合、Javascriptエラーとなるので注意すること。
 *
 * @link Jsonの妥当性確認場所
 * http://jsonlint.com/
 * @link Closure Compiler
 * http://closure-compiler.appspot.com/home
 *
 * @author Yugo Kimura
 * @version 1.0
 *
 * -使い方
 * JSOM
 * var json = JSOM.toJson(<Object>);
 *
 *
 */
var JSOM = {
	/**
	 * Jsonを生成するメソッド
	 *
	 * @param params<Object> Json化したいオブジェクト
	 * @return json<String> Json文字列
	 */
	toJson : function(params, depth){
		if(!depth) depth = 0;
		depth++;
		var param = JSOM._looper(params, depth);
		if(depth === 1) param = "{" + param + "}";
		param = param.replace(/,\]/gim, "]").replace(/,\}/gim, "}");
		return param;
	},
	
	/**
	 * Objectを処理する内部処理
	 * 
	 * @param params<String||Number||Object||Array>
	 * @return json<String> Json文字列
	 */
	_looper : function(params, depth){
		var param = "";
		for(var key in params){
			switch(typeof params[key]){
				case "string" :
					param += '"' + key + '":"' + params[key] + '"';
				break;
				case "boolean" :
				case "number" :
					param += '"' + key + '":' + params[key];
				break;
				case "object" :
					if(params[key] === null){
						param += '"' + key + '": null';
						break;
					}else if(params[key].length == undefined){
						param += '"' + key + '" : {';
						param += arguments.callee(params[key], depth);
						param += "}";
					}else{
						param += '"' + key + '":[';
						for(var i = 0, l = params[key].length; i< l; i++){
							if(typeof params[key][i] == "string")
								param += '"' + params[key][i] + '",';
							else if(typeof params[key][i] == "number")
								param += params[key][i] + ',';
							else
								param += "{" + arguments.callee(params[key][i], depth) + "},";
						}
						param += "]";
					}
				break;
				case "undefined" :
				break;
			}
			param += ',';
		}
		return param;
	}
};

