function TableSearch(table) {

	this.id;

	this.trs;

	this.attrs;

	

	this.init(table);

}



TableSearch.prototype.init = function(table) {

	this.id    = table.id ? table.id : table;

	this.trs   = document.getElementById(this.id).childNodes[0].childNodes.length ?

		document.getElementById(this.id).childNodes[0].childNodes :

		document.getElementById(this.id).childNodes;

	this.attrs = new Array();

	

	var ths   = this.trs[0].childNodes;

	for (var i=0; i<ths.length; i++) {

		this.attrs[ths[i].innerText] = i;

	}

}



TableSearch.prototype.reset = function() {

	for (var i=1; i<this.trs.length; i++) {

		if (!this.trs[i].CheckHide) { // チェック絞込表示のためだけのくそ仕様

			this.trs[i].style.display = "";

		}

	}

	

	// トリガー

	this.searchTrigger();

}



TableSearch.prototype.search = function() {

	var sAttr     = arguments[0];

	var sValue    = arguments[1];

	var bSqueeze  = arguments[2];

	

	for (var i=1; i<this.trs.length; i++) {

		var tds = this.trs[i].childNodes;

		for (var j=0; j<tds.length; j++) {

			if (sAttr && j!=this.attrs[sAttr]) continue;

			if (

				(!sValue   || tds[j].innerHTML.indexOf(sValue)>-1) &&

				(!bSqueeze || this.trs[i].style.display != "none") &&

				(!this.trs[i].CheckHide) // チェック絞込表示のためだけのくそ仕様

			) {

				this.trs[i].style.display = "";

				break;

			} else {

				this.trs[i].style.display = "none";

			}

		}

	}

	

	// トリガー

	this.searchTrigger();

}



TableSearch.prototype.checkHideOn = function() {

	var checkAttr = arguments[0];

	for (var i=1; i<this.trs.length; i++) {

		var tds = this.trs[i].childNodes;

		var inputs = tds[checkAttr].getElementsByTagName('input');

		for (var j=0; j<inputs.length; j++) {

			if (

				(inputs[j].type == 'checkbox') && (!inputs[j].checked) &&

				(this.trs[i].style.display != "none") &&

				(!this.trs[i].CheckHide)

			) {

				this.trs[i].style.display = "none";

				this.trs[i].CheckHide     = true;

			}

		}

	}

	

	// トリガー

	this.searchTrigger();

}



TableSearch.prototype.checkHideOff = function() {

	var checkAttr = arguments[0];

	for (var i=1; i<this.trs.length; i++) {

		var tds = this.trs[i].childNodes;

		var inputs = tds[checkAttr].getElementsByTagName('input');

		for (var j=0; j<inputs.length; j++) {

			if (this.trs[i].CheckHide) {

				this.trs[i].style.display = "";

				this.trs[i].CheckHide     = false;

			}

		}

	}

	

	// トリガー

	this.searchTrigger();

}



TableSearch.prototype.searchTrigger = function() {}





function TableSearchControl(ts) {

	this.ts;

	this.ths;

	this.forms;

	

	this.init(ts);

}



TableSearchControl.prototype.init = function(ts) {

	this.ts  = ts;

	this.ths = new Array();

	for (var i=0; i<this.ts.trs[0].childNodes.length; i++) {

		var element = this.ts.trs[0].childNodes[i];

		if (element.innerText.length) this.ths.push(element);

	}

	

	for (var i=0; i<this.ths.length; i++) {

		this.ths[i].id           = i;

		this.ths[i].languege     = this;

		this.ths[i].style.cursor = "pointer";

		this.ths[i].onclick = function() {

			this.languege.openForm(this);

		}

	}

	

	this.forms = new Array();

	for (var i=0; i<this.ths.length; i++) {

		var dispID = this.ts.id+"_"+this.ths[i].innerHTML;

		

		this.forms[i]                       = document.createElement('span');

		this.forms[i].id                    = dispID;

		this.forms[i].style.display         = "none";

		this.forms[i].style.padding         = "1px";

		this.forms[i].style.borderLeft      = "2px solid #ffffff";

		this.forms[i].style.borderTop       = "2px solid #ffffff";

		this.forms[i].style.borderRight     = "2px solid #000000";

		this.forms[i].style.borderBottom    = "2px solid #000000";

		this.forms[i].style.backgroundColor = "#cccccc";

		this.forms[i].style.position        = "absolute";

		

		var eform = this.forms[i].getElementsByTagName('form').length ? 

			this.forms[i].getElementsByTagName('form')[0] : document.createElement('form');

		eform.languege      = this;

		eform.id            = this.ts.id+"_form"+i;

		eform.style.margin  = "0";

		eform.style.display = "inline";

		eform.onsubmit      = function() {

			this.languege.search(this);

			return false;

		}

		

		// 閉じる用のバー

		var closer = document.createElement('div');

		closer.languege = this;

		closer.style.cursor          = "pointer";

		closer.style.color           = "#ffffff";

		closer.style.backgroundColor = "#094aaa";

		closer.style.textAlign       = "right";

		closer.innerHTML             = "<b>×</b>";

		closer.onmousedown           = function() {

			var de = window.dragElement = this.parentNode.parentNode;

			de.startPX = parseInt(de.style.left);

			de.startPY = parseInt(de.style.top);

			de.startCX = event.x;

			de.startCY = event.y;

			de.bDrag   = 1;

		}

		closer.onmouseup             = function() {

			var de = window.dragElement;

			if (!de || !de.bDrag) return;

			if (

				parseInt(de.style.left) == de.startPX &&

				parseInt(de.style.top)  == de.startPY

			) {

				this.languege.hideFormAll();

			}

		}

		document.onmousemove           = function() {

			var de = window.dragElement;

			if (!de || !de.bDrag) return;

			var dx = event.x - de.startCX;

			var dy = event.y - de.startCY;

			de.style.left = de.startPX + dx;

			de.style.top  = de.startPY + dy;

		}

		document.onmouseup             = function() {

			var de = window.dragElement;

			if (!de || !de.bDrag) return;

			de.bDrag   = 0;

		}

		eform.insertAdjacentElement('AfterBegin', closer);

		

		// 検索フォームの中身

		var eValue    = document.createElement('<input name="value">');

		eValue.type   = "text";

		var eAttr     = document.createElement('<input name="attr">');

		eAttr.type    = "hidden";

		eAttr.value   = this.ths[i].innerHTML;

		var eSubmit   = document.createElement('<input name="Submit">');

		eSubmit.type  = "submit";

		eSubmit.value = "検索";

		eform.appendChild(eValue);

		eform.appendChild(eAttr);

		eform.appendChild(eSubmit);

		this.forms[i].appendChild(eform);

		document.body.appendChild(this.forms[i]);

	}

}



TableSearchControl.prototype.openForm = function(th) {

	for (var i=0; i<this.ths.length; i++) {

		if (i == th.id) {

			this.forms[i].style.display = "inline";

			this.forms[i].style.top = Event.pointerY(event);

			this.forms[i].style.left = Event.pointerX(event);

			var id = this.ts.id+"_form"+i;

			

			// フォーカス

			$(id).elements[0].focus();

		} else {

			this.forms[i].style.display = "none";

		}

	}

}



TableSearchControl.prototype.hideFormAll = function() {

	for (var i=0; i<this.ths.length; i++) {

		this.forms[i].style.display = "none";

	}

}



TableSearchControl.prototype.search = function() {

	var searchNum = 0;

	for (var i=0; i<this.ths.length; i++) {

		var id = this.ts.id+"_form"+i;

		var mform = new MForm ($(id));

		

		// サーチコントロール

		var attr  = mform.getValue('attr');

		var value = mform.getValue('value');

		if (value.length) this.ts.search(attr, value, searchNum++);

		

		if (mform.getValue('value')) {

			this.ths[i].style.fontStyle = "italic";

			this.ths[i].style.textDecoration = "underline";

		} else {

			this.ths[i].style.fontStyle = "normal";

			this.ths[i].style.textDecoration = "none";

		}

		this.forms[i].style.display = "none";

	}

	if (searchNum == 0) this.ts.reset();

}



TableSearchControl.prototype.reset = function() {

	for (var i=0; i<this.ths.length; i++) {

		var id = this.ts.id+"_form"+i;

		var mform = new MForm ($(id));

		mform.setValue('value', '');

	}

	this.search();

}


