(function(){

jQuery.fn.DataTable = function(config) {
	var _statuses = {"initial":0,"loading":1,"loaded":2};

	var target_id = this.attr("id");
	var target = this;
	var _index = 0;
	var _maxCount = 0;
	var _nowStatus = {};
	var _minRowHeight = 10;
	var _default = {
		_criteria: {},
		_themeImagePath: "",
		_paging: false,
		_showPageNumber: true,
		_allowChangeLines: true,
		_allowJumpPage: true,
		_allowBackgroundAllLoad: false,
		_selectableLines: [10,20,50,75,100],
		_dataCountLink: "",
		_dataLoadLink: "",
		_bodyHeight: -1,
		_lines: 20,
		_multiLoad: 10,
		_pageNumberText: "$max : $start - $end",
		_pagechangeLineText: "in Lines:",
		_jumpPageText: "Page:",
		_firstPageLinkText: "",
		_previousPageLinkText: "",
		_nextPageLinkText: "",
		_lastPageLinkText: "",
		_emptyText:"",
		_setRowData: function(obj) { return {}; },
		_afterShow: function() {},
		_afterHideModal: function() {},
		_errorOfCount: function(XMLHttpRequest, textStatus, errorThrown) { alert("Error! Please contact to system administrator."); },
		_errorOfGetData: function(XMLHttpRequest, textStatus, errorThrown) { alert("Error! Please contact to system administrator."); }
	};
	var _config = jQuery.extend(_default, config);
	jQuery.data(target.get(0), "config", _config);

	function changePageLines() {
		_config._lines = parseInt(jQuery("#" + target_id + "_delta_selector select").val());
		initializeTableData(0);
	}

	function jumpFirstPage() {
		_index = 0;
		showTableData(0,_config._lines);
	}
	function jumpPreviousPage() {
		_index -= _config._lines;
		showTableData(_index, _index + _config._lines);
	}
	function jumpNextPage() {
		_index += _config._lines;
		showTableData(_index, _index + _config._lines);
	}
	function jumpLastPage() {
		var adjust = (_maxCount % _config._lines == 0) ? _config._lines : _maxCount % _config._lines;
		_index = _maxCount - adjust;
		showTableData(_index, _index + _config._lines);
	}

	function jumpPage() {
		_index = ( jQuery("#" + target_id + "_page_selector select").val() - 1 ) * _config._lines;
		showTableData(_index, _index + _config._lines);
	}

	function copyCriteria() {
		var c = {};
		for ( i in _config._criteria ) {
			c[i] = _config._criteria[i];
		}
		return c;
	}
	function getCount() {
		jQuery.ajax({
			type: "GET",
			url: _config._dataCountLink, 
			data: copyCriteria(),
			async: false,
			dataType: "json",
			success: function(json, type) {
				_maxCount = json.count;
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				_config._errorOfCount(XMLHttpRequest, textStatus, errorThrown);
			}});
	}
	
	function getData(criteria, index) {
		criteria = jQuery.extend({
			"min":_index,
			"max":_index + _config._lines
		},criteria);

		_nowStatus[index] = _statuses.loading;
		var xmlHttpReq = jQuery.ajax({
			type: "GET",
			url: _config._dataLoadLink, 
			data: criteria,
			dataType: "json",
			success: function(json, type) {
				var resultDataCount = 0;
				var resultData = json.data;
				var count = json.startIndex;
				for ( var i = 0; i < resultData.length; i++ ) {
					jQuery.data(target.get(0),"data")[count++] = _config._setRowData(resultData[i]);
					resultDataCount++;
				}
				
				if ( resultDataCount == 0 ) {
					getCount();
					initializeTableData(0);
				}
				_nowStatus[index] = _statuses.loaded;
				delete jQuery.data(target.get(0),"requests")[index];

				if ( _config._allowBackgroundAllLoad && _config._allowBackgroundAllLoad == "true" ) {
					var i = 0;
					while ( i == 0 || i < _maxCount ) {
						if ( _nowStatus[i] == _statuses.initial ) {
							var criteria = jQuery.extend(copyCriteria(), {"min":i, "max":i + _config._lines});
							getData(criteria, i);
							break;
						}
						i += _config._lines;
					}
				}
			},
			error: function (XMLHttpRequest, textStatus, errorThrown) {
				_config._errorOfGetData(XMLHttpRequest, textStatus, errorThrown);
			}});
		jQuery.data(target.get(0),"requests")[index] = xmlHttpReq;
	}
	
	function showTableData(start, end) {
		if ( end >= _maxCount ) {
			end = _maxCount;
		}
		
		var id = setTimeout(showModal,300);
		if ( _nowStatus[start] == _statuses.initial ) {
			var criteria = jQuery.extend(copyCriteria(), {"min":start, "max":start + _config._lines});
			getData(criteria, start);
		}
		var i = 0;
		i = start + _config._lines;
		var max = i + ( _config._multiLoad * _config._lines );
		while ( i < max ) {
			if ( i < _maxCount && _nowStatus[i] == _statuses.initial ) {
				var criteria = jQuery.extend(copyCriteria(), {"min":i, "max":i + _config._lines});
				getData(criteria, i);
			}
			i += _config._lines;
		}
		i = start - _config._lines;
		var min = i - ( _config._multiLoad * _config._lines );
		while ( i >= min ) {
			if ( i >= 0 && _nowStatus[i] == _statuses.initial ) {
				var criteria = jQuery.extend(copyCriteria(), {"min":i, "max":i + _config._lines});
				getData(criteria, i);
			}
			i -= _config._lines;
		}
		
		var createTableData = function() {
			if ( _nowStatus[start] == _statuses.loaded ) {
				if ( _config._bodyHeight > 0 ) {
					target.find("tr").each(function() {
					});
				}

				var height = 0;
				var afterHeight = 0;
				var str = "";
				var tmpData = jQuery.data(target.get(0),"data").slice(start, end);
				for ( i = 0; i < tmpData.length; i++ ) {
					var obj = tmpData[i];
					if ( _config._bodyHeight <= 0 || _config._bodyHeight >= height ) {
						str += "<tr style='height:" + _minRowHeight + "px;' class='results-row'>";
						for ( j = 0; j < jQuery.data(target.get(0),"header").length; j++ ) {
							var columnData = obj[jQuery.data(target.get(0),"header")[j]];
							if ( columnData != 0 && !columnData ) {
								columnData = "";
							}
	
							str += "<td class='" + jQuery.data(target.get(0),"header")[j] + "'>" + columnData + "</td>";
						}
						str += "</tr>";
						height += _minRowHeight;
					} else {
						afterHeight += _minRowHeight;
					}
				}

				if ( afterHeight != 0 ) {
					var cnt = 0;
					for ( j = 0; j < jQuery.data(target.get(0),"header").length; j++ ) {
						cnt++;
					}
					str += "<tr style='height:" + afterHeight + "px' class='after-ajust'><td colspan='" + cnt + "'></td></tr>";
					target.parents(".search-results:first").bind("scroll", scrolling);
					jQuery.data(target.get(0), "scrollTop", 0);
					jQuery.data(target.get(0), "firstRowNumber", 0);
					jQuery.data(target.get(0), "lastRowNumber", Math.floor(height / _minRowHeight));
				}
				target.find(".results-row").remove();
				target.append(str);
				target.find(".results-row:even").each(function() {
					var evenClass = "portlet-section-body";
					jQuery(this).addClass(evenClass);
					jQuery(this).bind("mouseover", function() { jQuery(this).removeClass(evenClass); jQuery(this).addClass(evenClass + "-hover"); jQuery(this).addClass("hover"); });
					jQuery(this).bind("mouseout", function() { jQuery(this).addClass(evenClass); jQuery(this).removeClass(evenClass + "-hover");jQuery(this).removeClass("hover"); });
				});
				target.find(".results-row:odd").each(function() {
					var oddClass = "portlet-section-alternate";
					jQuery(this).addClass(oddClass);
					jQuery(this).addClass("alt");
					jQuery(this).bind("mouseover", function() { jQuery(this).removeClass(oddClass); jQuery(this).addClass(oddClass + "-hover"); jQuery(this).addClass("hover"); });
					jQuery(this).bind("mouseout", function() { jQuery(this).addClass(oddClass); jQuery(this).removeClass(oddClass + "-hover");jQuery(this).removeClass("hover"); });
				});
				if ( _config._paging ) {
					controlLink();
				}

				_config._afterShow();
				hideModal();
				clearTimeout(id);
			} else {
				setTimeout(createTableData, 500);
			}
		}
		createTableData();
	}
	function showModal() {
		var parent = target.parent();
		parent.css("display","none");
		if ( jQuery("#" + target_id + "_glayLayer").size() == 0 ) {
			var parent_width = parent.css("width");
			if ( parent_width == "auto" ) {
				parent_width = "100%";
				half_width = "50%";
			} else {
				parent_width = parent_width.substring(0,parent_width.length-2); // Cut of 'width' string, Becouse 'px' character in getting 'width'.
				half_width = parent_width / 2 + "px";
				parent_width = parent_width + "px";
			}
			parent.after("<div id='" + target_id + "_overLayer' style='position:relative;top:-100px;left:" + half_width + ";margin-top:34px;margin-left:-16px;z-index:2;'><img src='" + _config._themeImagePath + "/progress_bar/loading_animation.gif'></div>");
			parent.after("<div id='" + target_id + "_glayLayer' style='height:100px;width:" + parent_width + ";border:1px solid #000;z-index:1;'></div>");
		}
	}

	function hideModal() {
		setTimeout(function() {
			var parent = target.parent();
			parent.css("display", "block");
			jQuery("#" + target_id + "_glayLayer").remove();
			jQuery("#" + target_id + "_overLayer").remove();
			_config._afterHideModal()
		}, 500);
	}

	function scrolling(event) {
		var beforeScrollTop = jQuery.data(target.get(0), "scrollTop");
		var firstRowNumber = jQuery.data(target.get(0), "firstRowNumber");
		var lastRowNumber = jQuery.data(target.get(0), "lastRowNumber");
		var scrollTop = jQuery(event.target).scrollTop();
		var aaa = "";
		aaa += "firstRowNumber:" + firstRowNumber + "\n";
		aaa += "lastRowNumber:" + lastRowNumber + "\n";
		aaa += "beforeScrollTop:" + beforeScrollTop + "\n";
		aaa += "scrollTop:" + scrollTop + "\n";
		//alert(aaa);
		jQuery.data(target.get(0), "scrollTop", scrollTop);

		var tableData = jQuery.data(target.get(0),"data");
		var headerCount = 0;
		for ( j = 0; j < jQuery.data(target.get(0),"header").length; j++ ) {
			headerCount++;
		}

		var scrollRange = scrollTop - beforeScrollTop;
		if ( scrollRange > 0 ) {
			if ( scrollTop >= (_config._bodyHeight/2) ) {
				var rangeHeight = 0;
				var beforeAjustObj = target.find("tr.before-ajust:first");
				var afterAjustObj = target.find("tr.after-ajust:first");

				var scrollBuffer = jQuery.data(target.get(0), "scrollBuffer");
				if ( scrollBuffer != undefined ) {
					scrollRange += parseInt(scrollBuffer);
				}
				var removeList = new Array();
				target.find("tr.results-row").each(function() {
					if ( rangeHeight <= scrollRange ) {
						rangeHeight += jQuery(this).height();
						removeList.push(jQuery(this));
					}
				});
				if ( removeList.length != 0 ) {
					removeList.pop();
				}

				jQuery.data(target.get(0), "scrollBuffer");
				//alert("scrollRange:" + scrollRange + "\nrangeHeight:" + rangeHeight + "\nremoveList:" + removeList);
				var tmpData = tableData.slice(lastRowNumber, lastRowNumber + removeList.length);
				var str = "";
				for ( i = 0; i < tmpData.length; i++ ) {
					var obj = tmpData[i];
					str += "<tr style='height:" + _minRowHeight + "px;' class='results-row'>";
					for ( j = 0; j < jQuery.data(target.get(0),"header").length; j++ ) {
						var columnData = obj[jQuery.data(target.get(0),"header")[j]];
						if ( columnData != 0 && !columnData ) {
							columnData = "";
						}

						str += "<td class='" + jQuery.data(target.get(0),"header")[j] + "'>" + columnData + "</td>";
					}
					str += "</tr>";
				}
				target.find("tr.results-row:last").after(str);
				for ( i = 0; i < removeList.length; i++ ) {
					removeList[i].remove();
				}

				if ( beforeAjustObj.size() != 0 ) {
					beforeAjustObj.css("height", parseInt(beforeAjustObj.css("height")) + rangeHeight);
				} else {
					target.find("tr.results-row:first").before("<tr style='height:" + rangeHeight + "px' class='before-ajust'><td colspan='" + headerCount + "'></td></tr>");
				}
				if ( afterAjustObj.size() != 0 ) {
					afterAjustObj.css("height", parseInt(afterAjustObj.css("height")) - rangeHeight);
				} else if ( lastRowNumber + removeList.length >= tableData.length ) {
					afterAjustObj.remove();
				}

				jQuery.data(target.get(0), "firstRowNumber", firstRowNumber + removeList.length);
				if ( lastRowNumber + removeList.length < tableData.length ) {
					jQuery.data(target.get(0), "lastRowNumber", lastRowNumber + removeList.length);
				}
				if ( removeList.length != 0) {
					jQuery.data(target.get(0), "scrollBuffer", 0);
				} else {
					jQuery.data(target.get(0), "scrollBuffer", scrollRange);
				}
			}
		} else {
			scrollRange *= -1;
			var afterHeight = 0;
			jQuery(target.find("tr.results-row").get().reverse()).each(function() {
				if ( afterHeight < scrollRange ) {
					afterHeight += jQuery(this).height();
					removeList.push(jQuery(this));
				}
			});
		}
	}

	function showControlLink(first) {
		var str = "";
		var page_adjust = (_maxCount % _config._lines == 0) ? 0 : 1;
		var max_page = Math.floor(( _maxCount / _config._lines ) + page_adjust);
		var page     = _index / _config._lines + 1;

		if ( _config._showPageNumber ) {
			var pageNumberText = _config._pageNumberText;
			pageNumberText = pageNumberText.replace("$max", _maxCount);
			pageNumberText = pageNumberText.replace("$start", ( _maxCount == 0 ) ? 0 : _index + 1);
			if ( _maxCount > _index + _config._lines ) {
				pageNumberText = pageNumberText.replace("$end", _index + _config._lines);
			} else {
				pageNumberText = pageNumberText.replace("$end", _maxCount);
			}
			jQuery("#" + target_id + "_results").html(pageNumberText);
		}

		if ( _config._allowChangeLines ) {
			str = "";
			str += _config._pagechangeLineText;
			str += "<select>";
			for ( i = 0; i < _config._selectableLines.length; i++ ) {
				if ( _config._selectableLines[i] == _config._lines ) {
					str += "<option value='" + _config._selectableLines[i] + "' selected>" + _config._selectableLines[i] + "</option>";
				} else {
					str += "<option value='" + _config._selectableLines[i] + "'>" + _config._selectableLines[i] + "</option>";
				}
			}
			str += "</select>";
			jQuery("#" + target_id + "_delta_selector").empty();
			jQuery("#" + target_id + "_delta_selector").html(str);
		}
		
		if ( _config._allowJumpPage ) {
			str = ""
			str += _config._jumpPageText;
			str += "<select>";
			for ( i = 1; i <= max_page; i++ ) {
				if ( page == i ) {
					str += "<option value='" + i + "' selected>" + i + "</option>";
				} else {
					str += "<option value='" + i + "'>" + i + "</option>";
				}
			}
			str += "</select>/" + max_page;
			jQuery("#" + target_id + "_page_selector").empty();
			jQuery("#" + target_id + "_page_selector").html(str);
		} else {
			jQuery("#" + target_id + "_page_selector").empty();
			jQuery("#" + target_id + "_page_selector").html(_config._jumpPageText + page + "/" + max_page);
		}

		var firstATag       = "<a id='" + target_id + "_first' class='first' href='#'>" + _config._firstPageLinkText + "</a>";
		var previousATag    = "<a id='" + target_id + "_previous' class='previous' href='#'>" + _config._previousPageLinkText + "</a>";
		var nextATag        = "<a id='" + target_id + "_next' class='next' href='#'>" + _config._nextPageLinkText + "</a>";
		var lastATag        = "<a id='" + target_id + "_last' class='last' href='#'>" + _config._lastPageLinkText + "</a>";
		var firstSpanTag    = "<span id='" + target_id + "_first' class='first'>" + _config._firstPageLinkText + "</span>";
		var previousSpanTag = "<span id='" + target_id + "_previous' class='previous'>" + _config._previousPageLinkText + "</span>";
		var nextSpanTag     = "<span id='" + target_id + "_next' class='next'>" + _config._nextPageLinkText + "</span>";
		var lastSpanTag     = "<span id='" + target_id + "_last' class='last'>" + _config._lastPageLinkText + "</span>";

		str = "";
		str += (page > 2)                                    ? firstATag    : firstSpanTag;
		str += (page > 1)                                    ? previousATag : previousSpanTag;
		str += (_index + _config._lines < _maxCount)         ? nextATag     : nextSpanTag;
		str += (_index + ( _config._lines * 2 ) < _maxCount) ? lastATag     : lastSpanTag;
		jQuery("#" + target_id + "_links").empty();
		jQuery("#" + target_id + "_links").html(str);
	}

	function controlLink() {
		showControlLink();
		
		jQuery("#" + target_id + "_delta_selector select").change(changePageLines);
		jQuery("#" + target_id + "_page_selector select").change(jumpPage);

		var page     = _index / _config._lines + 1;
		if ( page > 2 ) {
			jQuery("#" + target_id + "_first").bind("click", jumpFirstPage);
		}
		if ( page > 1 ) {
			jQuery("#" + target_id + "_previous").bind("click", jumpPreviousPage);
		}
		if ( _index + _config._lines < _maxCount ) {
			jQuery("#" + target_id + "_next").bind("click", jumpNextPage);
		}
		if ( _index + ( _config._lines * 2 ) < _maxCount) {
			jQuery("#" + target_id + "_last").bind("click", jumpLastPage);
		}
	}
	
	function analyzeHeader() {
		jQuery.data(target.get(0),"header", Array());
		jQuery("#" + target_id + "_header").find("th").each(function() {
			jQuery.data(target.get(0),"header").push(jQuery(this).attr("id"));
		})
	}

	function clearSortClass(header_row) {
		var sortable_headers = header_row.find(".sortable");
		sortable_headers.each(function() {
			jQuery(this).removeClass("sort-column");
			jQuery(this).removeClass("sort-asc");
			jQuery(this).removeClass("sort-desc");
		});
	} 

	function sort_asc(column_id) {
		var str = "";
		for ( a in _config._criteria ) {
			str += a + ":" + _config._criteria[a] + "\n";
		}
		//alert(str);
		var header_row = jQuery("#" + target_id + "_header");
		var target_header = header_row.find("#" + column_id);
		clearSortClass(header_row);
		target_header.addClass("sort-column");
		target_header.addClass("sort-asc");
		target_header.unbind("click");
		target_header.bind("click", {"column_id":target_header.attr("id")}, sort_desc_event);

		var str = "";
		for ( a in _config._criteria ) {
			str += a + ":" + _config._criteria[a] + "\n";
		}
		//alert(str);
		if ( _config._paging ) {
			initializeTableData(0, column_id, 1);
		} else {
			jQuery.data(target.get(0),"data").sort( function(a, b) {
				var a_comp = (isNaN(a[column_id])) ? a[column_id] : parseInt(a[column_id]);
				var b_comp = (isNaN(b[column_id])) ? b[column_id] : parseInt(b[column_id]);
				if ( a_comp == b_comp ) {
					return 0;
				} else if ( a_comp > b_comp ) {
					return 1;
				} else {
					return -1;
				}
			});
		}
	}

	function sort_desc(column_id) {
		var str = "";
		for ( a in _config._criteria ) {
			str += a + ":" + _config._criteria[a] + "\n";
		}
		//alert(str);
		var header_row = jQuery("#" + target_id + "_header");
		var target_header = header_row.find("#" + column_id);
		clearSortClass(header_row);
		target_header.addClass("sort-column");
		target_header.addClass("sort-desc");
		target_header.unbind("click");
		target_header.bind("click", {"column_id":target_header.attr("id")}, sort_asc_event);
		
		var str = "";
		for ( a in _config._criteria ) {
			str += a + ":" + _config._criteria[a] + "\n";
		}
		//alert(str);
		if ( _config._paging ) {
			initializeTableData(0, column_id, -1);
		} else {
			jQuery.data(target.get(0),"data").sort( function(a, b) {
				var a_comp = (isNaN(a[column_id])) ? a[column_id] : parseInt(a[column_id]);
				var b_comp = (isNaN(b[column_id])) ? b[column_id] : parseInt(b[column_id]);
				if ( a_comp == b_comp ) {
					return 0;
				} else if ( a_comp < b_comp ) {
					return 1;
				} else {
					return -1;
				}
			});
		}
	}

	function sort_asc_event(event) {
		var str = "";
		for ( a in _config._criteria ) {
			str += a + ":" + _config._criteria[a] + "\n";
		}
		//alert(str);
		sort_asc(event.data.column_id);
	}
	function sort_desc_event(event) {
		var str = "";
		for ( a in _config._criteria ) {
			str += a + ":" + _config._criteria[a] + "\n";
		}
		//alert(str);
		sort_desc(event.data.column_id);
	}

	function initialize() {
		for ( i in jQuery.data(target.get(0),"requests") ) {
			jQuery.data(target.get(0),"requests")[i].abort();
		}
		jQuery.data(target.get(0),"requests",{});
		jQuery.data(target.get(0),"data", Array());

		// set back original state.
		var parent = target.parent();
		if ( parent.attr("tagName").toLowerCase() == "div" && parent.attr("className") == "search-results" ) {
			parent.after(target);
			parent.remove();
			target.find("span.result-column-name").each(function() {
				jQuery(this).find("a").each(function() {
					jQuery(this).after(jQuery(this).html());
					jQuery(this).remove();
				})
				jQuery(this).after(jQuery(this).html());
				jQuery(this).remove();
			});
		}
		
		// add of necessary tag and class.
		var wrap = jQuery("<div class='search-results'></div>");
		if ( _config._bodyHeight > 0 ) {
			wrap.css("max-height", _config._bodyHeight);
			wrap.css("overflow-y", "scroll");
		}
		target.wrap(wrap);
		target.addClass("taglib-search-iterator");
		var header_row = jQuery("#" + target_id + "_header")
		header_row.addClass("portlet-section-header");
		header_row.addClass("results-header");
		
		// get table information.
		analyzeHeader();
		showModal();
		getCount()

		// set page control division.
		if ( _config._paging ) {
			var divStr = "";
			divStr += "<div class='taglib-page-iterator'>";
			divStr += "<div id='" + target_id + "_results' class='search-results'></div>";
			divStr += "<div class='search-pages'>";
			divStr += "<div id='" + target_id + "_delta_selector' class='delta-selector'></div>";
			divStr += "<div id='" + target_id + "_page_selector' class='page-selector'></div>";
			divStr += "<div id='" + target_id + "_links' class='page-links'></div>";
			divStr += "</div></div>";
			target.before(divStr);
			showControlLink();
		}

		// analyze and set sorting column.
		var sortableObjs = jQuery("#" + target_id + "_header").find(".sortable");
		sortableObjs.each(function() {
			var obj = jQuery(this);
			obj.wrapInner("<span class='result-column-name'><a href='#'></a></span>");
			obj.bind("click", {"column_id":obj.attr("id")}, sort_asc_event);
		});

		var initAscSort = jQuery("#" + target_id + "_header").find(".asc:first");
		var initDescSort = jQuery("#" + target_id + "_header").find(".desc:first");
		if ( initAscSort.length != 0 ) {
			sort_asc(initAscSort.attr("id"));
		} else if ( initDescSort.length != 0 ) {
			sort_desc(initDescSort.attr("id"));
		} else {
			initializeTableData(0);
		}
	}

	function initializeTableData(showStartIndex, sortColumn, sortDirection) {
		for ( i in jQuery.data(target.get(0),"requests") ) {
			jQuery.data(target.get(0),"requests")[i].abort();
		}
		_nowStatus = {};
		jQuery.data(target.get(0),"requests",{});
		_index = 0;
//		var str = "";
//		for ( a in _config._criteria ) {
//			str += a + ":" + _config._criteria[a] + "\n";
//		}
//		alert(str);
		if ( _maxCount > 0 ) {
			var index = 0;
			if ( _config._paging ) {
				while ( index == 0 || index < _maxCount ) {
					_nowStatus[index] = _statuses.initial;
					if ( (index/_config._lines) <= _config._multiLoad ) {
						var criteria = jQuery.extend(copyCriteria(), {"min":index, "max":index + _config._lines});
						if ( sortColumn != undefined ) {
							criteria["orderColumn"] = sortColumn;
						}
						if ( sortDirection != undefined ) {
							criteria["orderDirection"] = sortDirection;
						}
						getData(criteria, index);
					}
					index += _config._lines;
				}
				showTableData(showStartIndex,showStartIndex + _config._lines);
			} else {
				_nowStatus[index] = _statuses.initial;
				var criteria = jQuery.extend(copyCriteria(), {"min":-1,"max":-1});
				if ( sortColumn != undefined ) {
					criteria["orderColumn"] = sortColumn;
				}
				if ( sortDirection != undefined ) {
					criteria["orderDirection"] = sortDirection;
				}
				getData(criteria, index);
				showTableData(index,_maxCount);
			}
		} else {
			var cnt = 0;
			var str = "";
			str += "<tr class='portlet-section-body results-row no-results'>";
			for ( j = 0; j < jQuery.data(target.get(0),"header").length; j++ ) {
				cnt++;
			}
			str += "<td colspan='" + cnt + "'><div align='center'>" + _config._emptyText + "</div></td>";
			str += "</tr>";
			target.find(".results-row").remove();
			target.append(str);
			_config._afterShow();
			hideModal();
		}
	}

	initialize();
	return this;
};

jQuery.fn.addRow = function(tdDatas, afterAdd) {
	var target_id = this.attr("id");
	var target = this;

	if ( tdDatas == undefined ) {
		tdDatas = {};
	}
	if ( afterAdd == undefined ) {
		afterAdd = function() {};
	}

	function addEvenRowOption(row) {
		var evenClass = "portlet-section-body";
		row.addClass(evenClass);
		row.bind("mouseover", function() { row.removeClass(evenClass); row.addClass(evenClass + "-hover"); row.addClass("hover"); });
		row.bind("mouseout", function() { row.addClass(evenClass); row.removeClass(evenClass + "-hover");row.removeClass("hover"); });
	}

	function addOddRowOption(row) {
		var oddClass = "portlet-section-alternate";
		row.addClass(oddClass);
		row.addClass("alt");
		row.bind("mouseover", function() { row.removeClass(oddClass); row.addClass(oddClass + "-hover"); row.addClass("hover"); });
		row.bind("mouseout", function() { row.addClass(oddClass); row.removeClass(oddClass + "-hover");row.removeClass("hover"); });
	}

	if ( target.attr("tagName").toLowerCase() == "table" ) {
		var lastRow = target.find("tr:last");
		var str = "";
		str += "<tr class='results-row'>";
		for ( j = 0; j < jQuery.data(target.get(0),"header").length; j++ ) {
			var columnData = tdDatas[jQuery.data(target.get(0),"header")[j]];
			if ( columnData != 0 && !columnData ) {
				columnData = "";
			}
			str += "<td class='" + jQuery.data(target.get(0),"header")[j] + "'>" + columnData + "</td>";
		}
		str += "</tr>";
		var newRow = jQuery(str);
		lastRow.after(newRow);
		if ( lastRow.attr("className").match(".*no-results.*") ) {
			addEvenRowOption(newRow);
		} else if (lastRow.attr("className").match(".*portlet-section-alternate.*")) {
			addEvenRowOption(newRow);
		} else {
			addOddRowOption(newRow);
		}
		if ( lastRow.attr("className").match(".*no-results.*") ) {
			lastRow.remove();
		}
		afterAdd();
	}
	return this;
};

jQuery.fn.removeRow = function() {
	var target_id = this.attr("id");
	var target = this;

	function resetEvenRowOption(row) {
	}

	function resetOddRowOption(row) {
		row.attr("className", "");
		row.unbind("mouseover");
		row.unbind("mouseout");

		var oddClass = "portlet-section-alternate";
		row.addClass(oddClass);
		row.addClass("alt");
		row.bind("mouseover", function() { row.removeClass(oddClass); row.addClass(oddClass + "-hover"); row.addClass("hover"); });
		row.bind("mouseout", function() { row.addClass(oddClass); row.removeClass(oddClass + "-hover");row.removeClass("hover"); });
	}

	if ( target.attr("tagName").toLowerCase() == "tr" ) {
		var table = target.parents("table:first");
		var tdCount = target.find("td").size();
		var config = jQuery.data(table.get(0), "config");
		target.remove();
		if ( table.find("tr.results-row").size() == 0 ) {
			var emptyRow = "<tr class='results-row portlet-section-body no-results'><td colspan='" + tdCount + "'><div align='center'>" + config._emptyText + "</div></td></tr>";
			table.append(emptyRow);
		} else {
			table.find(".results-row").each(function() {
				jQuery(this).attr("className", "results-row");
				jQuery(this).unbind("mouseover");
				jQuery(this).unbind("mouseout");
			});
			table.find(".results-row:even").each(function() {
				var evenClass = "portlet-section-body";
				jQuery(this).addClass(evenClass);
				jQuery(this).bind("mouseover", function() { jQuery(this).removeClass(evenClass); jQuery(this).addClass(evenClass + "-hover"); jQuery(this).addClass("hover"); });
				jQuery(this).bind("mouseout", function() { jQuery(this).addClass(evenClass); jQuery(this).removeClass(evenClass + "-hover");jQuery(this).removeClass("hover"); });
			});
			table.find(".results-row:odd").each(function() {
				var oddClass = "portlet-section-alternate";
				jQuery(this).addClass(oddClass);
				jQuery(this).addClass("alt");
				jQuery(this).bind("mouseover", function() { jQuery(this).removeClass(oddClass); jQuery(this).addClass(oddClass + "-hover"); jQuery(this).addClass("hover"); });
				jQuery(this).bind("mouseout", function() { jQuery(this).addClass(oddClass); jQuery(this).removeClass(oddClass + "-hover");jQuery(this).removeClass("hover"); });
			});
		}
	}
	return this;
};

})();
