// Emulate Internet Explorer methods
//
// Create: 2003-12-13 (shin)
//
// Internet Explorer で拡張されているメソッドを Netscape 6 で使えるようにするスクリプト
// エミュレートしているメソッド：
//   removeNode() - オブジェクトを削除
//   replaceNode() - オブジェクトを置換
//   swapNode() - オブジェクトを交換
//   applyElement() - エレメントオブジェクトを追加
//   contains() - オブジェクトが含まれているかチェック
//   insertAdjacentText() - 指定された位置にテキストを挿入
//   insertAdjacentHTML() - 指定された位置にHTMLを挿入
//   insertAdjacentElement() - 指定された位置にオブジェクトを挿入


// 初期設定
if (self.Node && self.Node.prototype) {
	Node.prototype.removeNode  = removeNode;
	Node.prototype.replaceNode = replaceNode;
	Node.prototype.swapNode    = swapNode;
	Element.prototype.applyElement          = applyElement;
	Element.prototype.contains              = contains;
	Element.prototype.insertAdjacentText    = insertAdjacentText;
	Element.prototype.insertAdjacentHTML    = insertAdjacentHTML;
	Element.prototype.insertAdjacentElement = insertAdjacentElement;
	Element.prototype.insert__Adj           = insert__Adj;
}

function removeNode(obj) {
	var parent = this.parentNode;
	if (parent && !obj) {
		var df = document.createDocumentFragment();
		for (var i=0; i<this.childNodes.length; i++) {
			df.appendChild(this.childNodes[i]);
		}
		parent.insertBefore(df,this);
	}
	return parent?parent.removeChild(this):this;
}

function replaceNode(obj) {
	return this.parentNode.replaceChild(obj, this);
}

function swapNode(obj) {
	var parent  = obj.parentNode;
	var sibling = obj.nextSibling;
	this.parentNode.replaceChild(obj, this);
	parent.insertBefore(this, sibling);
	return this;
}

function applyElement(element, type) {
	if (!element.splitText) {
		element.removeNode();
		if (type && (type.toLowerCase()=="inside")) {
			for (var i=0; i<this.childNodes.length; i++) {
				element.appendChild(this.childNodes[i]);
			}
			this.appendChild(element);
		} else {
			var parent = this.parentNode;
			parent.insertBefore(element, this);
			element.appendChild(this);
		}
		return element;
	}
}

function contains(obj) {
	var range = document.createRange();
	range.selectNode(this);
	return range.compareNode(obj)==3;
}

function insertAdjacentText(type, text) {
	var tnode = document.createTextNode(text||"");
	this.insert__Adj(type, tnode);
}

function insertAdjacentHTML(type, html) {
	var range = document.createRange();
	range.selectNode(this);
	var cf = range.createContextualFragment(html);
	this.insert__Adj(type, cf);
}

function insertAdjacentElement(type, element) {
	this.insert__Adj(type, element);
	return element;
}

function insert__Adj(type, data) {
	var parent = this.parentNode;
	var style  = type.toLowerCase();
	if (style == "beforebegin") {
		parent.insertBefore(data, this);
	}
	if (style == "afterbegin") {
		this.insertBefore(data, this.childNodes[0]);
	}
	if (style == "beforeend") {
		this.appendChild(data);
	}
	if (style == "afterend") {
		parent.insertBefore(data, this.nextSibling);
	}
}


