/*
 *	funny.js ver_0.6 β
 */

/*
	使用方法：(X)HTMLの<head>要素内で下記のように読み込む。
	<style type="text/javascript" src="js/funny.js"></script>
*/


window.funny = {
	//--------------------------------------------------------------------------------------
	//	$() getElementById()のショートカット
	//
	//	使用方法：
	//	funny.$("#header") -> #IDを取得する場合は、頭文字に"#"をつける。
	//	【※未実装】funny.$(".contents"）-> .classを取得する場合は、頭文字に"."をつける。
	//
	
	$: function($getElement) {
		//正規表現で、ID属性である証の"#○○○○"の値を抽出する。
		var $RegID = new RegExp( "^#(.*)", "g" );
		
		// "#" が頭文字についていたら、ID属性と判断する。
		if( $getElement.match($RegID) ) {
			// "#" を外して、ID名（○○○○）のみを抽出し、"$nameId"に代入
			var $nameId = RegExp.$1.toString();
			return document.getElementById($nameId);
		}else{
		// ID属性以外なら、エラーを返す。
			alert("ID名の前に\"#\"をつけるんだお。[ 例：$(\"#id_name\") ]");
		}
		
		/* 以下、クラス属性を取得し、DOM操作を実行できるメソッドを定義する予定 */
		
		/*else if( $getElement.match($RegClass) ){
			var $nameClass = RegExp.$1.toString();
			return document.getElementsByClassName($nameClass);
		}*/
	},
	
	//--------------------------------------------------------------------------------------
	//	funny.toggle() -> 表示、非表示を切り替える
	//
	//	使用注意：onload時にfunny.toggle();を読み込むこと！
	//	window.onload = function() {
	//		funny.toggle("#click","#toggle");
	//	}
	//
	
	toggle: function(c, t) {
		//コンフィグ
		var $click = this.$(c);//イベントハンドラ
		var $toggle = this.$(t);//非表示ブロック
		//デフォルト設定（表示）
		$toggle.style.display = "block";//"block" or "none"
		//クリックで表示切替
		$click.onclick = function() {
			if($toggle.style.display == "block") {
				$toggle.style.display = "none";
			}else if($toggle.style.display == "none"){
				$toggle.style.display = "block";
			}
		}
	},

	//--------------------------------------------------------------------------------------
	//property
	//
	kefia: "なにもないです。",
	
	//--------------------------------------------------------------------------------------
	//	funny.echo() document.write()のショートカット
	//
	echo: function($ret) {
		document.write( $ret );
	},
	
	//--------------------------------------------------------------------------------------
	//	funny.var_obj() オブジェクトの中のプロパティを参照
	//
	var_obj: function($obj) {
		for ($i in $obj) {
			//Firefox,Opera だと、変数に値をためていくと落ちるので、1つずつ吐き出している。
			var $ret = $obj.toString() + "[" + $i + "]" + " => " + $obj[$i] + "\n";
			this.addElement("div", $ret + "\n");
//			$objList += ( $obj.toString() + "[" + $i + "]" + " => " + $obj[$i] + "\n");
		}
	},
	
	//--------------------------------------------------------------------------------------
	//funny.getByte() 文字列のバイト数を求める関数
	//
	getByte: function($text) {
		var $count = 0;//default = 0byte
		
		//引数($text)の文字列長を得る
		for( $i = 0, $L = $text.length; $i < $L; $i++ ) {
			// %xx形式に変換し、文字列長を得る
			$n = escape($text.charAt($i));
			
			if($n.length < 4) {//4文字未満なら1byte足す
				$count++;
			}else{//4文字以上なら2byte足す
				$count += 2;
			}
		}
		return $count;
	},
	
	//--------------------------------------------------------------------------------------
	//funny.addElement() body要素にエレメントを追加する関数
	//
	addElement: function($cleateName, $innerHTML, $id) {
		var $element = document.createElement($cleateName);
		if($id) {$element.id = $id;}
		$element.innerHTML = $innerHTML;
		var $objBody = document.getElementsByTagName("body")[0];
		$objBody.appendChild($element);
	},

	//--------------------------------------------------------------------------------------
	//	funny.var_dump() 引数で指定された変数の構造化した情報を参照する。
	//
	//	使用例：
	//	
	//	var hoge = "hogehoge";
	//	var_dump(hoge)	//string(8)"hogehoge"
	//
	var_dump: function($v) {
		var $ret = "undefined";
		//型
		switch(typeof($v)) {//型を調べる
			//未定義
			case "undefined" :
				var $cvType = "undefined";
				$ret = $cvType + "&nbsp;" + this.kefia;
				break;
			//オブジェクト
			case "object" :
				var $cvType = "object";
				
				if( $v === null ) {
					$ret = $cvType + '\"' + $v + '\"';
				}else{
					var $objListBox = this.var_obj($v);
					$ret = $cvType + '\"' + $objListBox + '\"';
				}
				break;
			//関数
			case "function" :
				var $cvType = "function";
				$ret = $cvType + '\"' + $v + '\"';
				break;
			//文字列
			case "string" :
				var $cvType = "string";
				var $stByte = "(" + this.getByte($v) + ")";
				$ret = $cvType + $stByte + '\"' + $v + '\"';
				break;
			//数値
			case "number" :
				var $cvType = "number";
				$ret = $cvType + "(" + $v + ")";
				break;
			//真偽値
			case "boolean" :
				var $cvType = "boolean";
				$ret = $cvType + "(" + $v + ")";
				break;
		}
	//調べた変数の値を返す
		if(typeof($v) !== "object"){
			this.addElement("div", $ret + "\n", "ret");
		}
	},

	//--------------------------------------------------------------------------------------
	//	funny.Ajax()
	//
	//	使用例：
	//
	Ajax: function() {
		var request = null;
		try {
			request = new XMLHttpRequest();
		} catch(tryMicrosoft) {
			try {
				request = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(otherMicrosoft) {
				try {
					request = new ActiveXObject("Microsoft.XMLHTTP");
				} catch(failed) {
					request = null;
				}
			}
		}
		if(request == null) {
			alert(this.kefia);
		}
	}
	
	
	
	
	//--------------------------------------------------------------------------------------
	//lastLine
};