/* 
 * 文字コード変換ライブラリ
 * 
 * (C)SmartRams Co.,Ltd. 2008 All Rights Reserved．
 * 
 * 本技術情報には当社の機密情報が含まれておりますので、当社の
 * 書面による承諾がなく第３者に開示することはできません。
 * また、当社の承諾を得た場合であっても、本技術情報は外国為替
 * 及び外国貿易管理法に定める特定技術に該当するため、非居住者
 * に提供する場合には、同法に基づく許可を要することがあります。
 *                                          有限会社 スマート・ラムズ
 *-------------------------------------------------------------------
 * 
 * @package  
 * @author   岡本 順子
 * @language JavaScript
 * @version  1.0
 * @since    2007/05/11 ver1.0 初版作成 岡本順子
 * @info     
 */


/*****************************
  エンコード
******************************/
/*
 * ECMA-262準拠unicodeエンコード
 * @access	public
 * @param	string		target	エンコード対象文字列
 * @return	string				エンコード後文字列
 * @info    JavaScriptのescape()関数はブラウザによって挙動か異なり、
 * 			サーバサイドスクリプトのURLエンコード･デコードとは互換性がないので
 * 			IEのECMA-262準拠unicodeエンコードを基準に相互変換を可能にする
 */
function uni262encode(target) {
	var s;
	var ret = "";
	for (var i=0;i<target.length;i++) {
		s = target.charCodeAt(i);
		if (s <= 255){		// ascii文字
			if (s <= 15) {						// CrLf(改行コード)･Tab等
				// 変換（cf.Crは[0D]ではなく[d]となってしまう）
				ret += "%0" + s.toString(16);
			} else if (s >= 48 && s <= 57) {	// 半角数字
				// そのまま
				ret += target.charAt(i);
			} else if (s >= 65 && s <= 90) {	//アルファベット大文字
				// そのまま
				ret += target.charAt(i);
			} else if (s >= 97 && s <= 122) {	//アルファベット小文字
				// そのまま
				ret += target.charAt(i);
			} else {
				// [<][>][&]等は変換
				ret += "%" + s.toString(16);
			}
		} else {			// 日本語文字
			//16進変換
			ret = ret + "%u" + s.toString(16);
		}
	}
	return ret;
}

/*
 * mod_rewrite用(二重にかける)ECMA-262準拠unicodeエンコード
 * @access	public
 * @param	string		target	エンコード対象文字列
 * @return	string				エンコード後文字列
 * @info    JavaScriptのescape()関数はブラウザによって挙動か異なり、
 * 			サーバサイドスクリプトのURLエンコード･デコードとは互換性がないので
 * 			IEのECMA-262準拠unicodeエンコードを基準に相互変換を可能にする
 */
function uni262encodeEx(target) {
	var s;
	var ret = "";
	var ret_str = uni262encode(target);
	for (var i=0;i<ret_str.length;i++) {
		s = ret_str.charCodeAt(i);
		if (s <= 255){		// ascii文字
			if (s <= 15) {						// CrLf(改行コード)･Tab等
				// そのまま
				ret += ret_str.charAt(i);
			} else if (s >= 48 && s <= 57) {	// 半角数字
				// そのまま
				ret += ret_str.charAt(i);
			} else if (s >= 65 && s <= 90) {	//アルファベット大文字
				// そのまま
				ret += ret_str.charAt(i);
			} else if (s >= 97 && s <= 122) {	//アルファベット小文字
				// そのまま
				ret += ret_str.charAt(i);
			} else {
				// [<][>][&]等は変換
				ret += "%" + s.toString(16);
			}
		} else {			// 日本語文字
			// そのまま
			ret += ret_str.charAt(i);
		}
	}
	return ret;
}
