var ml_GridPage = 'Page';
var ml_GridPageNumber = 'Page Number:';
var ml_GridEmpty = 'No data was found.';

// RealGrid.js
//	Contains all javascript code to support the clientside rendering of the realgrid and handling of events like
//	RowClicked, RowButtonClicked

function removeClassName (elem, className) {
	elem.className = elem.className.replace(className, "").trim();
}

function addCSSClass (elem, className) {
	removeClassName (elem, className);
	elem.className = (elem.className + " " + className).trim();
}

String.prototype.trim = function() {
	return this.replace( /^\s+|\s+$/, "" );
}

function stripedTable() {		
	if (document.getElementById && document.getElementsByTagName) {  
		var allTables = document.getElementsByTagName('table');
		if (!allTables) { return; }

		for (var i = 0; i < allTables.length; i++) {
			if (allTables[i].className.match(/[\w\s ]*scrollTable[\w\s ]*/)) {
				var trs = allTables[i].getElementsByTagName("tr");
				for (var j = 0; j < trs.length; j++) {
					removeClassName(trs[j], 'alternateRow');
					addCSSClass(trs[j], 'normalRow');
				}
				for (var k = 0; k < trs.length; k += 2) {
					removeClassName(trs[k], 'normalRow');
					addCSSClass(trs[k], 'alternateRow');
				}
			}			
		}
	}
}

// onload state is fired, append onclick action to the table's DIV */
// container. This allows the HTML document to validate correctly. */
// addIEonScroll added on 2005-01-28                               */
// Terence Ordona, portal[AT]imaputz[DOT]com                       */
function addIEonScroll() {
	var thisContainer = document.getElementById('tableContainer');
	if (!thisContainer) { return; }

	var onClickAction = 'toggleSelectBoxes();';
	thisContainer.onscroll = new Function(onClickAction);
}

// Only WinIE will fire this function. All other browsers scroll the TBODY element and not the DIV */
// This is to hide the SELECT elements from scrolling over the fixed Header. WinIE only.           */
// toggleSelectBoxes added on 2005-01-28 */
// Terence Ordona, portal[AT]imaputz[DOT]com         */
function toggleSelectBoxes() {
	var thisContainer = document.getElementById('tableContainer');
	var thisHeader = document.getElementById('fixedHeader');
	if (!thisContainer || !thisHeader) { return; }

	var selectBoxes = thisContainer.getElementsByTagName('select');
	if (!selectBoxes) { return; }

	for (var i = 0; i < selectBoxes.length; i++) {
		if (thisContainer.scrollTop >= eval(selectBoxes[i].parentNode.offsetTop - thisHeader.offsetHeight)) {
			selectBoxes[i].style.visibility = 'hidden';
		} else {
			selectBoxes[i].style.visibility = 'visible';
		}
	}
} 

function writeTableHeader(view, tableName, divElementName, command)
{

	var divElement = document.getElementById(divElementName);
	
	var divHeight = new String();
	divHeight =  divElement.style.height;
	divHeight = divHeight.replace(/px/g,'');
	
	
	var tableHeight = '';
	if (divHeight != '')
	{
		if (pageCount > 1)
			tableHeight = divHeight + 'px';
		else
			tableHeight = (divHeight - 40) + 'px';
	}
	var divWidth = new String();
	divWidth =  divElement.style.width;
	divWidth = divWidth.replace(/px/g,'');
	
	var scrollPosition = divElement.scrollTop;
	divElement.innerHTML = '';
	
	var newHTML = new String();
	
	var table = command.getElementsByTagName("TableDef")[0];
	var isSelectable = table.getAttribute("IsSelectable");
	if (isSelectable == "True") isSelectable = true; else isSelectable = false;
	
	var tableData = command.getElementsByTagName("TableData")[0];
	var columns = table.getElementsByTagName("Column");
	

	var tableTag = new String();
	
	if (tableHeight != '' || divWidth != '') {
		tableTag = '<div style="overflow: auto;[TABLEHEIGHT][TABLEWIDTH]">';
		tableTag += '<table border="0" cellpadding="0" cellspacing="0" ID="[ID]" style="[TABLEWIDTH]">';
	}
	else
		tableTag = '<table border="0" cellpadding="0" cellspacing="0" ID="[ID]" style="[TABLEWIDTH]">';

	if (tableHeight != '')
		tableTag = tableTag.replace(/\[TABLEHEIGHT\]/g,'height: ' + tableHeight + ';');
	else
		tableTag = tableTag.replace(/\[TABLEHEIGHT\]/g,'');

	if (divWidth != '')
		tableTag = tableTag.replace(/\[TABLEWIDTH\]/g, 'width: ' + divWidth + ';');
	else
		tableTag = tableTag.replace(/\[TABLEWIDTH\]/g, '');
	tableTag = tableTag.replace(/\[ID\]/g,divElement.id + '_table');	
	newHTML += tableTag;

	tableTag = '<thead class="fixedHeader" id="[ID]">';
	tableTag = tableTag.replace(/\[ID\]/g,divElement.id + '_fixedHeader');
	tableTag = tableTag.replace(/\[DIVELEMENTNAME\]/g,divElementName);

	newHTML += tableTag;	
	
	newHTML += '<tr>';
	
	for (var i = 0; i < columns.length; i++)
	{
		if (columns[i].getAttribute("Width") != null)
		{
			var toolTip = columns[i].getAttribute("Tooltip");
			tableTag = '<th title=\'[TOOLTIP]\' onclick="JavaScript:tableHeaderClicked(\'[VIEW]\', \'[TABLE]\',\'[COLUMN]\', this);"><div style="width: [WIDTH]; OVERFLOW: hidden"><nobr>';
			tableTag = tableTag.replace(/\[WIDTH\]/g,columns[i].getAttribute("Width"));			
			tableTag = tableTag.replace(/\[VIEW\]/g,view);
			tableTag = tableTag.replace(/\[TABLE\]/g,tableName);
			tableTag = tableTag.replace(/\[COLUMN\]/g,columns[i].getAttribute("Name"));
			tableTag = tableTag.replace(/\[TOOLTIP\]/g,toolTip);
			newHTML += tableTag;
		}
		else newHTML += '<th>';
		
		newHTML += columns[i].childNodes[0].nodeValue;	
		if (columns[i].getAttribute("Name") == table.getAttribute("SortColumn"))
		{
			tableTag = '&nbsp;&nbsp;<img  src="../RealJAX/images/[DIRECTION].gif" >';							
			tableTag = tableTag.replace(/\[DIRECTION\]/g,table.getAttribute("SortDirection"));
			newHTML += tableTag;
		}							
		newHTML += '</nobr></div></th>';
	}
	
	newHTML += '</tr>';
	
	newHTML += '</thead>';	
	
	newHTML += writeTableDataHTML(view, tableName, divElementName, tableData, table, tableHeight, isSelectable	)
	
	newHTML += '</table>';
	if (tableHeight != '' || divWidth != '') 
		newHTML += '</div>';
	tableTag = '<table  border="0" cellpadding="0" cellspacing="0" style="[TABLEWIDTH]">';
	if (divWidth != '')
		tableTag = tableTag.replace(/\[TABLEWIDTH\]/g, 'width: ' + divWidth + ';');
	else
		tableTag = tableTag.replace(/\[TABLEWIDTH\]/g, '');
	
	newHTML += tableTag;

	
	var pageCount = parseInt(table.getAttribute("PageCount"));
	if (pageCount > 1) { // alert('yezz');
		footerTag = '<TR><TD valign=bottom colspan=' + columns.length + '>';	
		footerTag = footerTag.replace(/\[ID\]/g,divElement.id + '_fixedFooter');
		footerTag = footerTag.replace(/\[TOP\]/g,divElement.style.height );	
	
		newHTML += footerTag;
		newHTML += _getPagingLinks(pageCount, parseInt(table.getAttribute("PageNumber")) + 1, view, tableName);
		newHTML += "&nbsp;&nbsp;";
		newHTML += _getPagingInput(parseInt(table.getAttribute("PageNumber")) + 1, view, tableName);
		newHTML += '</td></tr>';
	}
	newHTML += '</table>';
	divElement.innerHTML = newHTML;	
	//prompt("table html is", newHTML);
}

// Creates paging links for usage in the footer of the table                      */
// It is implemented as:                                                          */
// Page 1 .. 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 .. 44 */
function _getPagingLinks(pageCount, pageNr, view, tableName) {
	var newHTML = ml_GridPage + ' ';
	var pageWindow = 10;
	if (pageCount < pageWindow) pageWindow = pageCount;
	
	// Show first page:
	newHTML += _getPagingLink(1, view, tableName, (pageNr == 1));
	
	// Show paging window
	var startWindow = pageNr - (pageWindow / 2);
	if (startWindow <= 0) startWindow = 1; 
	var endWindow = startWindow + pageWindow;
	if (endWindow > pageCount) {
		endWindow = pageCount;
		startWindow = endWindow - pageWindow;
		if (startWindow <= 0) startWindow = 1;
	}
	if (startWindow > 2) newHTML += '&nbsp;..'; 
	
	for (var p=startWindow; p<endWindow; p++) {
		if (p != 1 && p != pageCount) {
			newHTML += '&nbsp;';
			newHTML += _getPagingLink(p, view, tableName, (pageNr == p));
		}
	}
	newHTML += '&nbsp;';
	if (endWindow < pageCount) newHTML += '..&nbsp;';
	// Show last page:
	newHTML += _getPagingLink(pageCount, view, tableName, (pageNr == pageCount));
	
	return newHTML;
}

function _getPagingLink(pageNr, view, tableName, active) {
	if (active) {
		var linkTag = '<a class="pagingCurrentLink">[PAGENR]</a>';
		linkTag = linkTag.replace(/\[PAGENR\]/g,pageNr);
	}
	else {
		var linkTag = '<a class="pagingLink" onclick="JavaScript:tablePageLinkClicked(\'[VIEW]\', \'[TABLE]\', \'[PAGENR]\', this);">[PAGENR]</a>';
		linkTag = linkTag.replace(/\[VIEW\]/g,view);
		linkTag = linkTag.replace(/\[TABLE\]/g,tableName);
		linkTag = linkTag.replace(/\[PAGENR\]/g,pageNr);
	}
	
	return linkTag;
}
function _getPagingInput(pageNr, view, tableName) {
	//return '<input style="Width: 20px;" />';
	var inputTag = ml_GridPageNumber + ' <input class="pagingInput" onkeyup="JavaScript:tablePageInputChanged(\'[VIEW]\', \'[TABLE]\', this);" value="[PAGENR]" />';
	inputTag = inputTag.replace(/\[VIEW\]/g,view);
	inputTag = inputTag.replace(/\[TABLE\]/g,tableName);
	inputTag = inputTag.replace(/\[PAGENR\]/g,pageNr);
	return inputTag;
}
function tablePageInputChanged(view, tableName, context)
{
	if (isnumeric(context.value))
	{
		tablePageLinkClicked(view, tableName, context.value);
	}
}
function isnumeric(sValue)
{
	stst = new String(sValue);
	var bIsNum = true;
	for (var i=0; i < stst.length; i++)
	{
		var ntst = parseFloat(stst.substring(i,i+1));
		if (isNaN(ntst))
			{bIsNum = false;}
	}
	return(bIsNum);
}

function _hoverIn(el) { 
	//alert(el.className);
	if (el.className == 'selectedRow')
		el.className = 'selectedRowHoover'
	if (el.className == 'normalRow')
		el.className = 'normalRowHoover'
	if (el.className == 'alternateRow')
		el.className = 'alternateRowHoover'
}
function _hoverOut(el) {
	if (el.className == 'selectedRowHoover')
		el.className = 'selectedRow';
	if (el.className == 'normalRowHoover')
		el.className = 'normalRow';
	if (el.className == 'alternateRowHoover')
		el.className = 'alternateRow';
}

function writeTableDataHTML(view, tableName, divElementName, tableData, tableDef, tableHeight, isSelectable)
{			
	var newHTML = "";
	var testje = "";
	var alternate = false;	
			
	var table = tableDef
	var columnsDef = table.getElementsByTagName("Column");
	var tableTag = new String();
		
	var columns = tableData.getElementsByTagName("Column");
	var dataKeys = tableData.getElementsByTagName("DataKeyValues")[0].getElementsByTagName("Value");
	var selected = table.getElementsByTagName("SelectedRows")[0].getElementsByTagName("Selection");
	
	if (dataKeys.length == 0)
	{ 
		newHTML += '<table style="Width: 100%;"><tr><td  class="[CLASS]">' + ml_GridEmpty + '</td></tr></table>';
		newHTML = newHTML.replace(/\[CLASS\]/g,"normalRow");
	}
	else
	{
		for (var i = 0; i < dataKeys.length; i++)
		{	
			var rowClass = "";
			if (alternate) rowClass = "alternateRow";
			if (!alternate) rowClass = "normalRow";
			alternate = !alternate;
			//see if the row should be selected
			for (var k = 0; k < selected.length; k++)
			{
				if (selected[k].childNodes[0].nodeValue == dataKeys[i].childNodes[0].nodeValue) rowClass = "selectedRow";
			}
			
			if (table.getAttribute("Mode") == "Picker")
			{
				tableTag = '<tr id="[ID]" onmouseover="javascript:_hoverIn(this);" onmouseout="javascript:_hoverOut(this);" onclick=\'JavaScript:returnFromPicker("[VIEW]", "[FORFIELD]", "[ID]")\' class="[CLASS]" >';
				tableTag = tableTag.replace(/\[CLASS\]/g,rowClass);			
				tableTag = tableTag.replace(/\[VIEW\]/g,view);			
				tableTag = tableTag.replace(/\[FORFIELD\]/g,table.getAttribute("ForField"));
				tableTag = tableTag.replace(/\[ID\]/g,dataKeys[i].childNodes[0].nodeValue);
			}		
			else
			{		
				if (isSelectable)
					tableTag = '<tr id="[ID]" onmouseover="javascript:_hoverIn(this);" onmouseout="javascript:_hoverOut(this);" onclick="JavaScript:tableRowClicked(\'[VIEW]\', \'[TABLE]\', \'[ID]\',  \'[DATAKEY]\', this);" class="[CLASS]" > ';
				else
					tableTag = '<tr id="[ID]" class="[CLASS]" > ';
				tableTag = tableTag.replace(/\[VIEW\]/g,view);
				tableTag = tableTag.replace(/\[ID\]/g,divElementName + "_row" + dataKeys[i].childNodes[0].nodeValue);
				tableTag = tableTag.replace(/\[CLASS\]/g,rowClass);
				tableTag = tableTag.replace(/\[TABLE\]/g,tableName);		
				tableTag = tableTag.replace(/\[DATAKEY\]/g,dataKeys[i].childNodes[0].nodeValue);
			}
			
			newHTML += tableTag;		
			
			for (var j = 0; j <columns.length; j++)
			{			
				newHTML += "<td>";
				testje = "";
				
				var style = new String();
				
				
				if (columnsDef[j].getAttribute("Width") != null)
				{				
					style += 'width: [WIDTH]; OVERFLOW: hidden;';
					style = style.replace(/\[WIDTH\]/g,columnsDef[j].getAttribute("Width"));						
				}											
				
				if (columnsDef[j].getAttribute("Type") == "ImageCommand")
				{
					var toolTip = columnsDef[j].getAttribute("Tooltip");
					style += 'TEXT-ALIGN: center;';	
					if (isSelectable)			
						tableTag = '<img src="[URL]" class="imageCommandColumn" alt="[TOOLTIP]" onmouseover="javascript:_hoverIn(this);" onmouseout="javascript:_hoverOut(this);" onclick="JavaScript:tableButtonClicked(\'[VIEW]\', \'[TABLE]\',\'[COLUMN]\',\'[DATAKEY]\', this);"/>';
					else
						tableTag = '<img src="[URL]" class="imageCommandColumn" alt="[TOOLTIP]" onclick="JavaScript:tableButtonClicked(\'[VIEW]\', \'[TABLE]\',\'[COLUMN]\',\'[DATAKEY]\', this);"/>';
					tableTag = tableTag.replace(/\[URL\]/g,columnsDef[j].getAttribute("ImageURL"));			
					tableTag = tableTag.replace(/\[VIEW\]/g,view);
					tableTag = tableTag.replace(/\[TABLE\]/g,tableName);
					tableTag = tableTag.replace(/\[COLUMN\]/g,columnsDef[j].getAttribute("Name"));
					tableTag = tableTag.replace(/\[DATAKEY\]/g,dataKeys[i].childNodes[0].nodeValue);
					tableTag = tableTag.replace(/\[TOOLTIP\]/g,toolTip);
					testje = tableTag;
				}
				else if (columnsDef[j].getAttribute("Type") == "Text")
				{
					var dataNodes = columns[j].getElementsByTagName("Value");
					if (isSelectable)
						testje = '<span style="width: 100%;" onmouseover="javascript:_hoverIn(this);" onmouseout="javascript:_hoverOut(this);">'
					else
						testje = '<span style="width: 100%;">'
					if (dataNodes != null && dataNodes.length != 0 && dataNodes[i].childNodes.length != 0)
					{
						//alert(decode(dataNodes[i].childNodes[0].nodeValue));
						testje += decode_utf8(decode(dataNodes[i].childNodes[0].nodeValue));
					}
					else testje += "&nbsp;";
					testje += '</span>';
				}	
				else if (columnsDef[j].getAttribute("Type") == "LinkText")
				{
					var dataNodes = columns[j].getElementsByTagName("Value");
					if (dataNodes != null && dataNodes.length != 0 && dataNodes[i].childNodes.length != 0)
					{
						if (isSelectable)
							tableTag = '<span class="linkColumn" onmouseover="javascript:_hoverIn(this);" onmouseout="javascript:_hoverOut(this);" onclick="JavaScript:tableButtonClicked(\'[VIEW]\', \'[TABLE]\',\'[COLUMN]\',\'[DATAKEY]\', this);">';
						else
							tableTag = '<span class="linkColumn" onclick="JavaScript:tableButtonClicked(\'[VIEW]\', \'[TABLE]\',\'[COLUMN]\',\'[DATAKEY]\', this);">';
						tableTag += decode_utf8(decode(dataNodes[i].childNodes[0].nodeValue));
						tableTag += '</span>';
						tableTag = tableTag.replace(/\[VIEW\]/g,view);
						tableTag = tableTag.replace(/\[TABLE\]/g,tableName);
						tableTag = tableTag.replace(/\[COLUMN\]/g,columnsDef[j].getAttribute("Name"));
						tableTag = tableTag.replace(/\[DATAKEY\]/g,dataKeys[i].childNodes[0].nodeValue);
						testje = tableTag;					
					}
					else testje = "&nbsp;";			
				}
				
				tableTag = '<div style="[STYLE]">';
				tableTag = tableTag.replace(/\[STYLE\]/g,style);
				newHTML += tableTag;
				newHTML += testje;
				newHTML += "</DIV>";					
				
				newHTML += "</td>";
			}
			newHTML += "</tr>";		
		}		
	}
	//alert(newHTML);
	return newHTML;	
}

function tableButtonClicked(view, table, column, dataKey, context)
{	
	var commandString = new String();
	var controllerId = null;
	eval('controllerId = ' + view + 'ControllerId;');
	
	commandString = controllerURL + '?_method=TableButtonClicked&_sender=[TABLE]&_controller_id=[CONTROLLERID]&_column=[COLUMN]&_dataKey=[DATAKEY]';
	commandString = commandString.replace(/\[TABLE\]/g,table);
	commandString = commandString.replace(/\[CONTROLLERID\]/g,controllerId);
	commandString = commandString.replace(/\[COLUMN\]/g,column);
	commandString = commandString.replace(/\[DATAKEY\]/g,dataKey);	
	
	ajax_request(commandString,'',null, context);				
}				

function tableHeaderClicked(view, table, column, context)
{
	var commandString = new String();
	var controllerId = null;
	eval('controllerId = ' + view + 'ControllerId;');
	
	commandString = controllerURL + '?_method=TableHeaderClicked&_sender=[TABLE]&_controller_id=[CONTROLLERID]&_column=[COLUMN]';
	commandString = commandString.replace(/\[TABLE\]/g,table);
	commandString = commandString.replace(/\[CONTROLLERID\]/g,controllerId);
	commandString = commandString.replace(/\[COLUMN\]/g,column);	
	
	ajax_request(commandString,'',null, context);				
}

function tablePageLinkClicked(view, table, pageNr, context)
{ 
	var commandString = new String();
	var controllerId = null;
	eval('controllerId = ' + view + 'ControllerId;');
	
	commandString = controllerURL + '?_method=TablePageLinkClicked&_sender=[TABLE]&_controller_id=[CONTROLLERID]&_pageNr=[PAGENR]';
	commandString = commandString.replace(/\[TABLE\]/g,table);
	commandString = commandString.replace(/\[CONTROLLERID\]/g,controllerId);
	commandString = commandString.replace(/\[PAGENR\]/g,pageNr);	
	
	ajax_request(commandString,'',null, context);
}

function tableRowClicked(view, table, id, datakey, context)
{
	
	var commandString = new String();
	var controllerId = null;
	eval('controllerId = ' + view + 'ControllerId;');
	
	commandString = controllerURL + '?_method=TableRowClicked&_sender=[TABLE]&_controller_id=[CONTROLLERID]&_dataKey=[DATAKEY]';
	commandString = commandString.replace(/\[TABLE\]/g,table);
	commandString = commandString.replace(/\[CONTROLLERID\]/g,controllerId);
	commandString = commandString.replace(/\[DATAKEY\]/g,datakey);	
	
	ajax_request(commandString,'',null, context);	
	
	 				 
}


