// Define content structure
function DataTable() {	
	this.oddClass = "";
	this.evenClass = "";
	this.xmlRowName = "";
	this.dataSource = "";
	this.page = 0;
	this.rowsPerPage = 0;
	this.tableId = "";
	this.nodata = "";
	this.hasTitle = true;
	this.hasPage = true;
}

// Title
DataTable.prototype.columnDefs;
// Table row css
DataTable.prototype.oddClass;
DataTable.prototype.evenClass;

// General vars
DataTable.prototype.rowsPerPage;
DataTable.prototype.xmlRowName;
DataTable.prototype.dataSource;
DataTable.prototype.page;
DataTable.prototype.tableId;
DataTable.prototype.hasTitle;
DataTable.prototype.hasPage;
DataTable.prototype.isProcessing;
DataTable.prototype.height;
DataTable.prototype.nodata;

// Functions
DataTable.prototype.load = getData;
DataTable.prototype.render = renderTable;
DataTable.prototype.http_request;

function getData(gotoPage) {
	if (this.isProcessing)
	{
		return;
	}
	this.isProcessing = true;
  try {	
	// An phan trang
	if(this.hasPage) {
		document.getElementById('previous').style.display='none';	
		document.getElementById('next').style.display='none';
	}

	// Remove old rows
    var table = document.getElementById(this.tableId);

	// Render title row
	if(this.hasTitle && table.rows.length == 0) {
		var titleRow = table.insertRow(table.rows.length);
		for(var i = 0; i < this.columnDefs.length; i++) {
			var newCell = document.createElement('th');
			newCell.width = this.columnDefs[i]['width'];
			newCell.height = this.height;
			newCell.className = this.columnDefs[i]['className'];
			newCell.innerHTML = this.columnDefs[i]['label'];
			titleRow.appendChild(newCell);
		}
	}

    var rowCount = table.rows.length;
	var index2Delete = 0;
	if (this.hasTitle)
	{
		index2Delete = 1;
	}

    while(rowCount > index2Delete) {
        table.deleteRow(rowCount-1);
        rowCount--;
    }
	
	// loading data message...
	var titleRow = table.insertRow(table.rows.length);
	var newCell = document.createElement('td');
	newCell.setAttribute('colspan', this.columnDefs.length);
	newCell.innerHTML = 'Loading data...'
	titleRow.appendChild(newCell);


	if (typeof(gotoPage) != 'undefined')
	{
		this.page += parseInt(gotoPage);		
	}
	if(this.page < 1) {
		this.page = 1;
	}

	if(this.dataSource.indexOf("?") != -1) {
		var str = '&page='+this.page+'&rowsPerPage='+this.rowsPerPage;
	}
	else {
		var str = '?page='+this.page+'&rowsPerPage='+this.rowsPerPage;
	}

	var PAGE_SUCCESS = 200;

	this.http_request = get_http_request();

	this.http_request.open("get", this.dataSource + str , false);
	this.http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');	 
	this.http_request.send(null);
	
	if(this.http_request.readyState == 4)		
	{				
		if (this.http_request.status == 200)
		{	
			this.render(this.http_request.responseXML);
			this.isProcessing = false;
		}
	}
  } catch(err){
    alert(err);
  }
}

function renderTable(xmlData) {
  try {
    var rowNum = xmlData.getElementsByTagName(this.xmlRowName).length;

    // Write html to document
    var table = document.getElementById(this.tableId);

	// Delete loading data message
	var index2Delete = 0;
	if (this.hasTitle)
	{
		index2Delete = 1;
	}

	if (table.rows.length >= index2Delete)
	{
		table.deleteRow(index2Delete);
	}
	
	// Render data rows
	if(rowNum == 0) {
		var newRow = table.insertRow(table.rows.length);
		newRow.className = this.oddClass;
		var newCell = newRow.insertCell(newRow.cells.length);
		newCell.width = '100%';
		newCell.height = this.height;
		newCell.colSpan = this.columnDefs.length;
		newCell.innerHTML = this.nodata;
	}
	else {
		var totalRows = 0;
		if(!this.hasPage) {
			totalRows = rowNum;
		} else {
			if(rowNum < this.rowsPerPage)
				totalRows = rowNum;
			else
				totalRows = this.rowsPerPage;
		}
		for(var i = 0; i < totalRows; i++) {
			var rowData = xmlData.getElementsByTagName(this.xmlRowName).item(i);
			var newRow = table.insertRow(table.rows.length);
			if(table.rows.length % 2 == 0) {
				newRow.className = this.evenClass;
			} else {
				newRow.className = this.oddClass;
			}
			for(var j = 0; j < this.columnDefs.length; j++) {
				var newCell = newRow.insertCell(newRow.cells.length);
				newCell.width = this.columnDefs[j]['width'];
				newCell.height = this.height;
				if(this.columnDefs[j]['key'] != "USING_TEMPLATE" && this.columnDefs[j]['key'] != "USING_MAPPER") {
					var tmp1 = rowData.getElementsByTagName(this.columnDefs[j]['key']).item(0).childNodes;
					var tmp2 = "";
					for(var x = 0; x < tmp1.length; x++) {
						tmp2 += tmp1.item(x).nodeValue; 
					}	
					newCell.innerHTML = tmp2;
				}
				else if(this.columnDefs[j]['key'] == "USING_TEMPLATE"){
					var resultHTML = this.columnDefs[j]['template'];
					var spliter = resultHTML.split("<xmlName>");
					for(var r = 0; r < spliter.length; r++) {
						if((r%2 > 0) && (spliter[r] != "")) {
							var xmlName = spliter[r];
							var tmp = rowData.getElementsByTagName(xmlName).item(0).childNodes;
							var xmlContent = "";
							for(var x = 0; x < tmp.length; x++) {
								xmlContent += tmp.item(x).nodeValue;
							}
							resultHTML = resultHTML.replace("<xmlName>"+xmlName+"<xmlName>", xmlContent);
						}
					}
					newCell.innerHTML = resultHTML;
				}
				else if(this.columnDefs[j]['key'] == "USING_MAPPER") {
					var tmp = rowData.getElementsByTagName(this.columnDefs[j]['mapkey']).item(0).childNodes;
					var xmlContent = "";
					for(var x = 0; x < tmp.length; x++) {
						xmlContent += tmp.item(x).nodeValue;
					}
					xmlContent = xmlContent.replace(/^\s+|\s+$/g, '');
					var result = xmlContent;
					for(var r = 0; r < this.columnDefs[j]['maptable'].length; r++) {
						var spliter = this.columnDefs[j]['maptable'][r].split("->");
						if(xmlContent == spliter[0]) {
							result = spliter[1];
							break;
						}
					}
					newCell.innerHTML = result;
				}
			}
		}
	}

	if(this.hasPage) {
		if (rowNum > this.rowsPerPage)
		{
			document.getElementById('next').style.display='';
		}
		else {
			document.getElementById('next').style.display='none';
		}

		if (this.page > 1) {
			document.getElementById('previous').style.display='';
		}
		else {
			document.getElementById('previous').style.display='none';
		}
	}
  } catch(err) {
      alert(err);
  }
}

function get_http_request()
{
	var http_request;
	if (window.XMLHttpRequest)
	{ // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{ // IE
		try
		{
			http_request = new ActiveXObject("Msxml2.XMLHTTP");

		}
		catch (e)
		{
			try
			{
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}

	if (!http_request)
	{
		alert('Giving up :( Cannot create an XMLHTTP instance');
		return false;
	} else {
		return http_request;
	}
}
