// M2Plus web 汎用Javascript関数
// 2010.12
// 



/**
 * クッキーが利用可能かどうかをチェックする.
 * (暫定実装)
 * @return boolean クッキーの保存->読み出しができたらtrue
 */
function m2plib_available_cookie() {

        return navigator.cookieEnabled;

}

function m2plib_available_cookie_nouse() {
	document.cookie = "m2plus_test=test;";

	var work = document.cookie +';';	
	var result = ( work.indexOf("m2plus_test=test;") >= 0 );

	document.cookie = "m2plus_test=0; expires=Fri, 31-Dec-1999 23:59:59 GMT;";
	
	return result;
}

/**
 * 数値文字列に3桁カンマを追加する.
 * <br />
 * 文字列を含まない純粋な数値(小数点、マイナスも含まないもの)
 * に対してカンマを付加します。
 * @param num 数値または数字文字列
 * @return String カンマ区切り文字列.
 */
function m2plib_addcomma_impl( num ) {
	var val = ('string' == typeof num) ? num : new String(num);
	var len = val.length;
	
	if ( len <= 3 ) {
		return val;
	}
	
	var idx = len % 3;
	
	if ( idx == 0 ) {
		idx = 3;
	}
	
	var result = val.substr(0, idx);
	
	while( idx < len ) {		
		result += ',' + val.substr(idx, 3);
		idx += 3;
	}
	
	return result;
}

/**
 * 文字列に含まれる数値をカンマ区切りに置換する.
 * <br />
 * いわゆる３桁カンマを付与します。
 * 単純な数値だけでなく、「3000円」のように
 * 数字以外の文字を含んでいても対応可能です。
 * <br />
 * 実装は正規表現を使わず、できるだけ軽いものにしてありますが、
 * 文字列操作のコストはあまり削っていません。
 * (ものすごく長い文字列を渡されることは想定していない）
 * 
 * @param String 置換する数値（を含む文字列）
 * @return String 置換後の文字列
 */
function m2plib_addcomma( strnum ) {
	var target = ('string' == typeof strnum) ? strnum : new String(strnum);	
	var result   = '';

	var fraction = false;	// 小数フラグ
	var ch    = '';
	var last  = '';			// 直前に処理した文字(.が小数点かどうかの判定に必要)
	var cache = '';

	for ( var i=0; i < target.length; i++ ) {
		ch = target.charAt(i);
		
		// 数字
		if ( M2PLIB_NUMBER_CHARS.indexOf(ch) >= 0 ) {
			if (fraction) {
				result += ch;
			} else {
				cache += ch;
			}
			
			last = ch;
			continue;
		}
		
		// 数字キャッシュがあれば整形して結合
		if ( cache.length > 0 ) {
			result += m2plib_addcomma_impl(cache);
			cache = '';
		}
		
		// 小数点の場合はフラグを設定
		if ( ch == '.' && last != '.' ) {
			fraction = true;
		} else {
			fraction = false;
		}

		result += ch;
		last = ch;
	}
	
	// 文字列が数字で終わっている場合は余りをここで処理
	if ( cache.length > 0 ) {
		result += m2plib_addcomma_impl(cache);
	}

	return result;
}

/**
 * 文字が数字かどうかを判定するのに使用する定数.
 */
var M2PLIB_NUMBER_CHARS    = '0123456789';
var M2PLIB_EXTNUMBER_CHARS = '0123456789.-';

/**
 * 引数が純粋な数値かどうか.
 * (カンマやピリオド、マイナス記号はNGとなります)
 * 
 * @param text String 数字文字列
 */
function m2plib_is_number( num ) {
	var text = new String(num);
	
	for( var i=0; i < text.length; i++ ) {
		if ( M2PLIB_NUMBER_CHARS.indexOf(text.charAt(i)) < 0 ) {
			return false;
		}
	}
	
	return true;
}

/**
 * 簡易入力文字種チェック（全角カタカナのみ許可）.
 * 正規表現で [ァ-ヾ] を使った方がよいのかもしれません。
 * @param text
 * @return
 */
function m2plib_charcheck_K( text ) {
	return m2plib_charcheck_impl( text, (M2PLIB_KKANA_ZEN + M2PLIB_KKANA_DZEN) );
}
/**
 * 簡易入力文字種チェック（全角ひらがなのみ許可）.
 * 正規表現で [ぁ-ゞ] を使った方がよいのかもしれません。
 * @param text
 * @return
 */
function m2plib_charcheck_H( text ) {
	return m2plib_charcheck_impl( text, (M2PLIB_HKANA_ZEN + M2PLIB_HKANA_DZEN) );
}

/**
 * 簡易入力文字種類チェック関数.
 * @param text String チェック対象
 * @param allows String 許可する文字リスト
 * @return boolean 
 */
function m2plib_charcheck_impl( text, allows ) {
	if ( typeof(text) != 'string' ) return true;
	
	for ( var i=0; i < text.length; i++ ) {
		if ( allows.indexOf(text.charAt(i)) < 0 ) {
			return false;
		}
	}
	
	return true;
}

/**
 * 半角英数を全角英数に変換する.
 * @param text
 * @return
 */
function m2plib_charconvert_a_A( text ) {
	return _m2plib_charconvert_impl( text, M2PLIB_ALNUM_HAN, M2PLIB_ALNUM_ZEN );
}
/**
 * 全角英数を半角英数に変換する.
 * @param text
 * @return
 */
function m2plib_charconvert_A_a( text ) {
	return _m2plib_charconvert_impl( text, M2PLIB_ALNUM_ZEN, M2PLIB_ALNUM_HAN );
}

/**
 * 半角カナ(だけ)を全角カナに変換する.
 * @param text
 * @return
 */
function m2plib_charconvert_k_K( text ) {
	var temp = _m2plib_charconvert_dkana_hz( text, M2PLIB_KKANA_DZEN );
	return _m2plib_charconvert_impl( temp, M2PLIB_KKANA_HAN, M2PLIB_KKANA_ZEN );
}
/**
 * 半角カナ(だけ)を全角かなに変換する.
 * @param text
 * @return
 */
function m2plib_charconvert_k_H( text ) {
	var temp = _m2plib_charconvert_dkana_hz( text, M2PLIB_HKANA_DZEN );
	return _m2plib_charconvert_impl( temp, M2PLIB_KKANA_HAN, M2PLIB_HKANA_ZEN );
}

/**
 * 半角カナと全角ひらがなを全角カナに変換する.
 * @param text
 * @return
 */
function m2plib_charconvert_kH_K( text ) {
	var temp = m2plib_charconvert_k_K( text );
	return _m2plib_charconvert_impl( temp, (M2PLIB_HKANA_ZEN + M2PLIB_HKANA_DZEN), (M2PLIB_KKANA_ZEN + M2PLIB_KKANA_DZEN) );
}
/**
 * 半角カナと全角カタカナを全角かなに変換する.
 * @param text
 * @return
 */
function m2plib_charconvert_kK_H( text ) {
	var temp = m2plib_charconvert_k_H( text );
	return _m2plib_charconvert_impl( temp, (M2PLIB_KKANA_ZEN + M2PLIB_KKANA_DZEN), (M2PLIB_HKANA_ZEN + M2PLIB_HKANA_DZEN) );
}

/**
 * 数字と単位のついた文字列から、数字のみを抽出する.
 * @param text String 「20.5px」 のような文字列
 * @return Number 上記の例だと 20.5
 */
function m2plib_cropnumber( text ) {
	if ( typeof(text) != 'string' ) return text;
	
	var result = '';
	
	for ( var i=0; i < text.length; i++ ) {
		var ch = text.charAt(i);
		
		var idx = M2PLIB_EXTNUMBER_CHARS.indexOf(ch);		
		if ( idx >= 0 ) {
			result += ch;
		}
	}
	
	return Number(result);
}


/**
 * 文字変換の実装.
 * @param text 変換を行う文字列
 * @param before 変換前の文字リスト
 * @param after  変換後の文字リスト
 * @return
 */
function _m2plib_charconvert_impl(text, before, after) {
	if ( typeof(text) != 'string' ) return text;
	
	var result = '';
	
	for ( var i=0; i < text.length; i++ ) {
		var ch = text.charAt(i);
		
		var idx = before.indexOf(ch);		
		if ( idx < 0 ) {
			result += ch;
		} else {
			result += after.substr(idx,1);
		}
	}
	
	return result;
}


/**
 * 半角の濁音文字を全角に変換する(実装).
 * 
 * @param text
 * @param after  変換後の文字リスト(全角カタカナorひらがな)
 * @return
 */
function _m2plib_charconvert_dkana_hz(text, after) {
	if ( typeof(text) != 'string' ) return text;
	
	var result = '';

	for ( var i=0; i < text.length; i++ ) {
		// 最後の１文字は置換処理不要
		if ( i == text.length -1 ) {
			result += text.charAt(i);
			break;
		}
		
		// 1文字ずつずらしながら2文字単位でチェックする感じ
		var ch  = text.charAt(i);		
		var ch2 = ch + text.charAt(i+1);
		
		var idx = M2PLIB_KKANA_DHAN.indexOf(ch2);
		if ( idx < 0 ) {
			result += ch;
		} else {
			result += after.substr(idx/2, 1);
			i++;
		}		
	}
	
	return result;	
}

/**
 * 全角の濁音文字を半角に変換する(実装).
 * 
 * @param text
 * @param before  変換前の文字リスト(全角カタカナorひらがな)
 * @return
 */
function _m2plib_charconvert_dkana_zh( text, before ) {
	if ( typeof(text) != 'string' ) return text;
	
	var result = '';
	
	for ( var i=0; i < text.length; i++ ) {
		var ch  = text.charAt(i);
		
		var idx = before.indexOf(ch);
		if ( idx < 0 ) {
			result += ch;
		} else {
			// 2文字追加する
			result += M2PLIB_KKANA_DHAN.substr(idx, 2);
		}
	}
	
	return result;
}

/*
 * UUID v4を取得する
 *	ex.) var uuid = UUID.generate().toString();
 */
function UUID() {}

UUID.generate = function() {
  var rand = UUID._getRandomInt, hex = UUID._hexAligner;
  return  hex(rand(32), 8)          // time_low
        + "-"
        + hex(rand(16), 4)          // time_mid
        + "-"
        + hex(0x4000 | rand(12), 4) // time_hi_and_version
        + "-"
        + hex(0x8000 | rand(14), 4) // clock_seq_hi_and_reserved clock_seq_low
        + "-"
        + hex(rand(48), 12);        // node
};

UUID._getRandomInt = function(x) {
  if (x <   0) return NaN;
  if (x <= 30) return (0 | Math.random() * (1 <<      x));
  if (x <= 53) return (0 | Math.random() * (1 <<     30))
                    + (0 | Math.random() * (1 << x - 30)) * (1 << 30);
  return NaN;
};

UUID._getIntAligner = function(radix) {
  return function(num, length) {
    var hex = num.toString(radix), i = length - hex.length, z = "0";
    for (; i > 0; i >>>= 1, z += z) { if (i & 1) { hex = z + hex; } }
    return hex;
  };
};

UUID._hexAligner = UUID._getIntAligner(16);

/** 置換用文字列：英数 */
var M2PLIB_ALNUM_HAN = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@-.,:;#&()=_[]{}%<>+*$!.?, /';
var M2PLIB_ALNUM_ZEN = '１２３４５６７８９０ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ＠－．，：；＃＆（）＝＿「」｛｝％＜＞＋＊＄！。？、　／';

/** 置換用文字列：かな */
var M2PLIB_KKANA_HAN  = 'ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｧｨｩｪｫｯｬｭｮｰﾞﾟｴｲ';
var M2PLIB_KKANA_ZEN  = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョー゛゜ヱヰ';
var M2PLIB_HKANA_ZEN  = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんぁぃぅぇぉっゃゅょー゛゜ゑゐ';

/** 置換用文字列：かな濁音 */
// 半角は文字数が2:1になっているので注意
var M2PLIB_KKANA_DHAN = 'ｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞﾀﾞﾁﾞﾂﾞﾃﾞﾄﾞﾊﾞﾋﾞﾌﾞﾍﾞﾎﾞﾊﾟﾋﾟﾌﾟﾍﾟﾎﾟｳﾞ';
var M2PLIB_KKANA_DZEN = 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ';
var M2PLIB_HKANA_DZEN = 'がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽヴ';


