/**
* dom.js
* (C) Copyright 2007, all rights reserved by DosTigres Corp.
* Ver. 0.0.4, 28-Feb-2008, add #checkRadio()
* Ver. 0.0.3, 14-Feb-2008, add #getRadioCheckedVal()
* Ver. 0.0.2, 12-Feb-2008, add #removeAllChilds()
* Ver. 0.0.1, 24-Nov-2007
**/

/**
* DOMラッパークラス
* ブラウザの違いを吸収して、DOMに関する統一的なインターフェースを提供する。
* @class dom
* @namespace dtlib
**/
if (typeof dtlib == "undefined") {
    var dtlib = {};
}

dtlib.dom = {
	/**
	* constatns
	**/
	version:'0.0.4',

	NodeType: {
		Tag: 1,
		Attribute: 2,
		Text: 3,
		Comment: 8,
		Document: 9
	},
	
	/**
	* window ロード時のイベントリスナー
	**/
	init: function(e) {
		if (typeof initHtml == 'function') {
			initHtml();
		}
	},
	
	/**
	* イベントリスナーの追加
	**/
	addEventListener: function(elem, eventType, func, cap) {
		if (elem.addEventListener) {
			elem.addEventListener(eventType, func, cap);
		} else if (elem.attachEvent) {
			elem.attachEvent('on' + eventType, func);
		}
	},
	
	/**
	* イベントハンドラの引数からイベントターゲットオブジェクトを取得する
	**/
	getTargetFromEventObj: function(eventObj) {
		if (eventObj.target) {
			return eventObj.target;
		} else if (eventObj.srcElement) {
			return eventObj.srcElement;
		}
		return null;
	},
	
	/**
	* クラス名とエレメント名にヒットするエレメントのリストを探す。
	* この関数はprivate。外部から呼び出されることは期待していない。
	* @param parentElem このエレメント以下のオブジェクトを探す
	* @param tagName タグ名。'*' で全てを対象とする。
	* @param className クラス名。'*' で全てを対象とする。
	* @param elementName エレメント名。'*' で全てを対象とする。
	* @param single trueの時は最初に見つかったオブジェクト単体を返す。falseの時はヒットしたオブジェクトのリストを返す。
	**/
	_getElementsByNames: function(parentElem, tagName, className, elementName, single) {
		if (parentElem == null) { parentElem = document; }
		var retList = [];
		var cands =parentElem.getElementsByTagName(tagName);
		var classPattern = className=='*' ? null : new RegExp('(^|\\s)' + className + '(\\s|$)');
		var cand, candClassName;
		for (var i=0, l=cands.length; i<l; i++) {
			cand = cands[i];
			// エレメント名とクラス名がマッチしないオブジェクトは除外する
			if (elementName!='*' && elementName!=cand.getAttribute('name')) { continue; }
			if (classPattern!=null && (className!=cand.className && !cand.className.match(classPattern))) { continue; }
			// 見つかった
			if (single) { return cand; }	// 上位が単体を期待しているとき
			retList.push(cand);				// 上位がリストを期待しているとき
		}
		if (retList.length==0) { return null; }
		return retList;
	},
	
	/**
	* クラス名にヒットするエレメントのリストを返す。
	* @param parentElem このエレメント以下のオブジェクトを探す
	* @param tagname タグ名。'*' で全てのタグを対象とする。
	* @param classname クラス名
	**/
	getElementsByClassName: function(parentElem, tagName, className) {
		return dtlib.dom._getElementsByNames(parentElem, tagName, className, '*', false);
	},
	
	/**
	* クラス名に最初にヒットするエレメントを返す。
	* @param parentElem このエレメント以下のオブジェクトを探す
	* @param tagname タグ名。'*' で全てのタグを対象とする。
	* @param classname クラス名
	**/
	getElementByClassName: function(parentElem, tagName, className) {
		return dtlib.dom._getElementsByNames(parentElem, tagName, className, '*', true);
	},
	
	/**
	* エレメント名にヒットするエレメントのリストを返す。
	* @param parentElem このエレメント以下のオブジェクトを探す
	* @param tagname タグ名。'*' で全てのタグを対象とする。
	* @param elementName エレメント名
	**/
	getElementsByName: function(parentElem, tagName, elementName) {
		return dtlib.dom._getElementsByNames(parentElem, tagName, '*', elementName, false);
	},
	
	/**
	* エレメント名にヒットする最初のエレメントを返す。
	* @param parentElem このエレメント以下のオブジェクトを探す
	* @param tagname タグ名。'*' で全てのタグを対象とする。
	* @param elementName エレメント名
	**/
	getElementByName: function(parentElem, tagName, elementName) {
		return dtlib.dom._getElementsByNames(parentElem, tagName, '*', elementName, true);
	},
	
	/**
	* クラス名とエレメント名にヒットするエレメントのリストを返す。
	* @param parentElem このエレメント以下のオブジェクトを探す
	* @param tagname タグ名。'*' で全てのタグを対象とする。
	* @param className クラス名
	* @param elementName エレメント名
	**/
	getElementsByClassNameAndName: function(parentElem, tagName, className, elementName) {
		return dtlib.dom._getElementsByNames(parentElem, tagName, className, elementName, false);
	},
	
	/**
	* クラス名とエレメント名にヒットする最初のエレメントを返す。
	* @param parentElem このエレメント以下のオブジェクトを探す
	* @param tagname タグ名。'*' で全てのタグを対象とする。
	* @param className クラス名
	* @param elementName エレメント名
	**/
	getElementByClassNameAndName: function(parentElem, tagName, className, elementName) {
		return dtlib.dom._getElementsByNames(parentElem, tagName, className, elementName, true);
	},
	
	
	/**
	* 指定エレメントが指定のタグかどうかを返す
	* @param elem エレメント
	* @param nodeName テストしたいタグ名（大文字）
	*/
	isTag: function(elem, nodeName) {
		return (elem.nodeType==dtlib.dom.NodeType.Tag && elem.nodeName==nodeName);
	},
	
	/**
	* 指定エレメントの最初の子テキストノードを返す。
	**/
	getFirstTextNode: function(parentElem) {
		var cands = parentElem.childNodes;
		for (var i=0, l=cands.length; i<l; i++) {
			if (cands[i].nodeType==dtlib.dom.NodeType.Text) {
				return cands[i];
			}
		}
		return null;
	},

	/**
	* 指定親オブジェクトに method='post' である formエレメントを追加する。
	**/
	appendPostForm: function(parentElem, id, name, action) {
		var frmElem = document.createElement('form');
		frmElem.setAttribute('method', 'post');
		if (id != null) { frmElem.setAttribute('id', id); }
		if (name != null) { frmElem.setAttribute('name', name); }
		if (action != null) { frmElem.setAttribute('action', action); }
		parentElem.appendChild(frmElem);
		return frmElem;
	},

	/**
	*  <input> のhiddenタグを生成する。
	* 属性をまとめてセットできる。
	**/
	createInputHidden: function(id, name, value) {
		var elem = document.createElement('input');
		elem.setAttribute('type', 'hidden');
		if (id != null) {	elem.setAttribute('id', id); }
		if (name != null) { elem.setAttribute('name', name); }
		if (value != null) { elem.setAttribute('value', value); }
		return elem;
	},
	
	/**
	* parentElemの子オブジェクトを全て削除する
	*/
	removeAllChilds: function(elem) {
		var childlist = elem.childNodes;
		if (childlist == null) { return; }
		for (i=childlist.length-1; i>=0; i--) {
			elem.removeChild(childlist[i]);
		}
	},
	
	/**
	* ラジオボタンの選択されている値を取得する
	*/
	getRadioCheckedVal: function(parent, name) {
		var radios = dtlib.dom.getElementsByName(parent, 'input', name);
		if (radios==null) { return ''; }
		for (var i=0, l=radios.length; i<l; i++) {
			if (radios[i].checked) {
				return radios[i].value;
			}
		}
		return '';
	},
	
	/**
	* ラジオボタンの選択を行う
	*/
	checkRadio: function(parent, name, val) {
		var radios = dtlib.dom.getElementsByName(parent, 'input', name);
		if (radios==null) { return ''; }
		for (var i=0, l=radios.length; i<l; i++) {
			radios[i].checked = (radios[i].value==val);
		}
	},
	

	/**
	* Dummy
	**/
	terminateDummy: function() {
	}
}

dtlib.dom.addEventListener(window, 'load', dtlib.dom.init, false);



