/**
 * @author seubi
 */


// RAJOUT EVENT pageChange + pageLoaded


YkeUI.YkeGrid = function() {};

YkeUI.YkeGrid.Column = function ()
{
		/* public */ this.member = null;
		/* public */ this.header = null;
		/* public */ this.rendering = null;
		/* public */ this.align = 'left';
		/* public */ this.enableSorting = true;	
		/* public */ this.width = null;
		/* public */ this.height = null;
		/* public */ this.trim = false;
}


YkeUI.YkeGrid.PagerButton = function(sAltText, sToolTip, sEnabledImage, sDisabledImage)
{
	/* public */ this.useImage = true;
	/* public */ this.altText = sAltText;
	/* public */ this.toolTip = sToolTip;
	/* public */ this.enabledImage = sEnabledImage;
	/* public */ this.disabledImage = sDisabledImage;
}

YkeUI.YkeGrid.AsyncLoader = function(retMethod, grid)
{
	/*public*/ this.asyncRetMethod = retMethod;
	/*public*/ this.ykeGridInstance = grid;
	/*public*/ this.bind = function(datasource, datacount)
				{
					if(datacount == null)
					{
						datacount = datasource.length;
					}
					this.asyncRetMethod(datasource, datacount, this.ykeGridInstance);	
				}
}

YkeUI.YkeGrid.Grid = function (htmlnode)
{
	/* private*/ _htmlnode = $(htmlnode);
	
	// boutons de pager
	/*public*/ this.pagerButtonFirst = new YkeUI.YkeGrid.PagerButton("|<", "Premiere page", "yke/css/ykegrid/btnFirst.gif", "yke/css/ykegrid/btnFirstDis.gif"  );
	/*public*/ this.pagerButtonBack = new YkeUI.YkeGrid.PagerButton("<", "Page précédante", "yke/css/ykegrid/btnBack.gif", "yke/css/ykegrid/btnBackDis.gif"  );
	/*public*/ this.pagerButtonNext = new YkeUI.YkeGrid.PagerButton(">", "Page suivante", "yke/css/ykegrid/btnNext.gif", "yke/css/ykegrid/btnNextDis.gif"  );
	/*public*/ this.pagerButtonLast = new YkeUI.YkeGrid.PagerButton(">|", "Dernière page", "yke/css/ykegrid/btnLast.gif", "yke/css/ykegrid/btnLastDis.gif"  );
	
	/*public*/ this.pagerButtonGoto = new YkeUI.YkeGrid.PagerButton("Goto", "Aller à la page", "yke/css/ykegrid/btnGoto.gif", null);
	
	// liste des colonnes a afficher
	/*public*/ this.columns = null;
	/*public*/ this.pkColumnIndex = -1; // numero de colone contenant un identifiant
	
	/*public*/ this.datasource = null;
	/*public*/ this.enableSorting = true;
	
	/*public*/ this.headerClassName = "header";
	/*public*/ this.lineClassName = "line";
	/*public*/ this.altLineFrequency = 1;
	/*public*/ this.altLineClassName = "altline";
	/*public*/ this.gotoLineClassName = "gotoline";
	
	
	/*public*/ this.pagerItemIndexStart = 0;
	/*public*/ this.pagerItemLength = -1;
	/*public*/ this.pagerVisible = false;
	
	/*public*/ this.columnOrderedClassName = "ordered";
	
	/*public*/ this.pagerClassName = "pager";
	/*public*/ this.pagerLinkClassName = "pagerLink";
	/*public*/ this.pagerCurrentClassName = "pagerCurrent";
	/*public*/ this.pagerDisabledLinkClassName = "pagerDisabledLink"
	
	/*public*/ this.sortColumn = null;
	/*public*/ this.sortDesc = false;
	/*public*/ this.sortAscMarkerImg = "yke/css/ykegrid/asc.gif";
	/*public*/ this.sortDescMarkerImg = "yke/css/ykegrid/desc.gif";
	
	/*public*/ this.tableWidth = null;
	/*public*/ this.tableID = null;
	/*public*/ this.tableClassName = "ykegrid";
	
	/*public*/ this.tooltipSorting = 'Trier la colonne ';
	/*public*/ this.tooltipPageLink = 'Page ';
	/*public*/ this.tooltipPageCurrent = 'Page actuelle';

	/*public*/ this.dynamicDataMapping;
	/*public*/ this.dynamicDataMappingLength;
	/*protected*/ this.dynamicDataSourceBuffer;
	
	/*protected*/ this.showPagerGoto = false;
	
	/*public*/ this.showAsyncLoading = null;
	
	
	this.rows = null;
	
	/*public*/ this.GetAllRows = function()
	{
		var r = new Array();
		for(p in this.rows)
		{
			var o = this.rows[p];
			if (typeof(o) == 'object')
			{
				var strD = typeof(o.style.color);
				try
				{
					if(strD == 'string')
						r.push(o);
				}
				catch(e)
				{
				}
			}
		}
		return r;
	}
	
	/*public*/ this.GetRow = function (pk)
	{
		return this.rows[pk];
	}
	
	
	/*public*/ this.GetSortHeaderClick = function ()
	{
	
		if(this.sorting.column != this.sorting.grid.sortColumn)
		{
			this.sorting.grid.sortColumn = this.sorting.column;
			this.sorting.grid.sortDesc = false;
		}
		else
		{
			this.sorting.grid.sortDesc = !this.sorting.grid.sortDesc;
		}
		if(this.sorting.grid.dynamicDataSourceBuffer != null)
		{
			this.sorting.grid.dynamicDataSourceBuffer = null;
		}
		this.sorting.grid.showPagerGoto=false;
		this.sorting.grid.Render();
		return false;
	}
	
	/* getRowsVisible */
	/*public*/ this.Render = function()
	{
		// PageChange event created !
		if(this.pageChange != null)
			this.pageChange();
		
		var renderHTML = true;
		
		if(this.dynamicDataMapping!=null && this.dynamicDataSourceBuffer == null && this.showAsyncLoading==null)
			renderHTML = false;
			
		

		
		
		if(renderHTML == true)
		{

			try
			{
				_htmlnode.innerHTML = '';	
			}
			catch(e)
			{
				//alert("pas glop");
			}
			
			
			var _table = document.createElement('table');
			_table.setAttribute('cellPadding', '3px');
			_table.setAttribute('cellSpacing', 0);
	
			if(this.tableWidth!=null) _table.style.width = this.tableWidth;
			if(this.tableID!=null) _table.id = this.tableID;
			if(this.tableClassName!=null) _table.className = this.tableClassName;
			
			var _table_body = document.createElement('tbody');
			
			// render header
			var _header_tr = document.createElement('tr');
			for(var i=0; i<this.columns.length; i++)
			{
				var td = document.createElement('th');		
				var csorting = true;
				if(this.columns[i].enableSorting != null && this.columns[i].enableSorting == false) csorting = false;
				if(this.enableSorting != true) csorting=false;
				if(csorting==true)
				{
					td.appendChild( renderHeaderCell(this.columns[i], this.sortColumn, this.sortDesc, this.sortAscMarkerImg, this.sortDescMarkerImg, this.tooltipSorting) );
					td.sorting = {column: this.columns[i].member, grid: this};
					if(this.columns[i].member == this.sortColumn)
					{
						td.className = this.columnOrderedClassName;
					}
					td.onclick = sortHeaderClick;
				}
				else
				{
					var lbl = this.columns[i].member;
					if(this.columns[i].header != null) lbl = this.columns[i].header;
					td.appendChild(document.createTextNode(lbl));
				}
				if(this.columns[i].width != null)
				{
					td.width = 	this.columns[i].width ;
				}
				_header_tr.appendChild(td);
				
			}
			_table_body.appendChild(_header_tr);
		}
		
		

		if(this.dynamicDataMapping == null && this.datasource != null)
		{
			// MODE FULL CLIENT
			
			var start = this.pagerItemIndexStart;
			var count = this.pagerItemLength;
			if(count < 0) count = this.datasource.length;
			else count = count + start;
			
			if(count>this.datasource.length) count = this.datasource.length;
			
			
			
			
			// sorting
			if (this.sortColumn != null)
			{
					var alphasort = false;
					for(var i=0; i<this.datasource.length; i++)
					{
						if(typeof(this.datasource[i][this.sortColumn]) != 'number')
						{
							alphasort = true;
							break;
						}
						else
						{
							this.datasource[i].__sortingIndex__ = this.datasource[i][this.sortColumn];
						}
					}
					
					if(alphasort == false)
					{
						this.datasource.sort(function(a,b)
							{
								return a.__sortingIndex__ - b.__sortingIndex__;
							});
					}
					else
					{
						this.datasource.propertySort(this.sortColumn);
					}
					if(this.sortDesc == true)this.datasource.reverse();
			}
				

			this.rows = MakeLines(_table_body, start, count, this.columns, this.datasource, this.altLineFrequency, this.lineClassName, this.altLineClassName, this.pkColumnIndex);
			
			//alert( "*" + rows);
		}
		else
		{
			
			// MODE DYNAMIC	: REQUETE
			if(this.dynamicDataSourceBuffer == null)
			{
				function dynamicDataRet(dataSources, count, ykegrid)
				{
					ykegrid.dynamicDataMappingLength = count;
					ykegrid.dynamicDataSourceBuffer = dataSources;
					ykegrid.Render();
				}
				
				var asyncRet = new YkeUI.YkeGrid.AsyncLoader(dynamicDataRet, this);
				this.dynamicDataMapping(this.pagerItemIndexStart,this.pagerItemLength,this.sortColumn,this.sortDesc, asyncRet);
				
				
				// anim loading
				if(renderHTML == true)
				{
					var loadingtr = document.createElement('tr');
					var loadingtd = document.createElement('td');
					loadingtd.setAttribute('colSpan', this.columns.length);	
					loadingtd.style.textAlign = 'center';
					
					
					if (typeof(this.showAsyncLoading) == 'string')
					{
						var imgLoading = document.createElement('img');
						imgLoading.src = this.showAsyncLoading;
						loadingtd.appendChild(imgLoading);
					}
					else
					{
						try
						{
							loadingtd.appendChild(this.showAsyncLoading);
						}
						catch(e)
						{
							
						}
					}
					
					loadingtr.appendChild(loadingtd);
					_table_body.appendChild(loadingtr);
				}
			}
			
			// MODE DYNAMIC : RESPONSE
			else
			{
				
				var start = 0; // TODO
				var count = this.dynamicDataSourceBuffer.length;
				this.rows = MakeLines(_table_body, start, (count+start), this.columns, this.dynamicDataSourceBuffer, this.altLineFrequency, this.lineClassName, this.altLineClassName, this.pkColumnIndex);
				
			}

			
		}
		
			
		var renderPager=renderHTML;
		if(this.dynamicDataSourceBuffer == null && this.datasource == null)
		{
			renderPager = false;
		}
	
		if(this.pagerVisible == true && renderPager)
		{
			//var _pagerDiv = document.createElement('div');
			//_pagerDiv.className = this.pagerClassName;
			
			var pagesCount =  5; 
			var currentPageIndex = currentPageIndex = Math.ceil(this.pagerItemIndexStart / this.pagerItemLength);;
			
			var mode = 'client';
			
			
			if(this.dynamicDataMapping == null)
			{
				// MODE FULL CLIENT
				pagesCount = Math.ceil(this.datasource.length / this.pagerItemLength); 
			}
			else
			{
				// MODE DYNAMIC : RESPONSE
				if(this.dynamicDataSourceBuffer != null)
				{
					mode = 'dynamic';
					pagesCount = Math.ceil(this.dynamicDataMappingLength / this.pagerItemLength); 
				}
			}
			
			var td = document.createElement('td');
			td.className = this.pagerClassName;
			
			var spannavig = document.createElement('span');
			spannavig.style.fontWeight = 'bold';
			
			if(currentPageIndex == 0)
			{
				var btnFirst = document.createElement('a');
				if(this.pagerButtonFirst.useImage == false)
				{
					btnFirst.appendChild(document.createTextNode(this.pagerButtonFirst.altText));
				}
				else
				{
					var btnFirstImg = document.createElement('img');
					btnFirstImg.style.border = '0px';
					btnFirstImg.alt = this.pagerButtonFirst.altText;
					btnFirstImg.src = this.pagerButtonFirst.disabledImage;
					btnFirstImg.title = this.pagerButtonFirst.toolTip;
					btnFirstImg.style.verticalAlign = 'middle';
					btnFirst.appendChild(btnFirstImg);
				}
				btnFirst.className = this.pagerDisabledLinkClassName;
				spannavig.appendChild(btnFirst);
				
				var sep = document.createElement('span');
				sep.innerHTML = "&nbsp;&nbsp;"
				spannavig.appendChild(sep);
				
				var btnBack = document.createElement('a');
				if(this.pagerButtonBack.useImage == false)
				{
					btnBack.appendChild(document.createTextNode(this.pagerButtonBack.altText));
				}
				else
				{
					var btnBackImg = document.createElement('img');
					btnBackImg.style.border = '0px';
					btnBackImg.alt = this.pagerButtonBack.altText;
					btnBackImg.src = this.pagerButtonBack.disabledImage;
					btnBackImg.title = this.pagerButtonBack.toolTip;
					btnBackImg.style.verticalAlign = 'middle';
					btnBack.appendChild(btnBackImg);
				}
				btnBack.className = this.pagerDisabledLinkClassName;
				spannavig.appendChild(btnBack);
			}
			else
			{
				var btnFirst = document.createElement('a');
				if(this.pagerButtonFirst.useImage == false)
				{
					btnFirst.appendChild(document.createTextNode(this.pagerButtonFirst.altText));
				}
				else
				{
					var btnFirstImg = document.createElement('img');
					btnFirstImg.style.border = '0px';
					btnFirstImg.alt = this.pagerButtonFirst.altText;
					btnFirstImg.src = this.pagerButtonFirst.enabledImage;
					btnFirstImg.style.verticalAlign = 'middle';
					btnFirstImg.title = this.pagerButtonFirst.toolTip;
					btnFirst.appendChild(btnFirstImg);
				}
				btnFirst.className = this.pagerLinkClassName;
				btnFirst.href='javascript:YkeClick()';
				btnFirst.itemID = 0;
				btnFirst.itemGrid = {grid: this};
				btnFirst.onclick = function() {
					changePage(this);
				}
				spannavig.appendChild(btnFirst);
				
				var sep = document.createElement('span');
				sep.innerHTML = "&nbsp;&nbsp;"
				spannavig.appendChild(sep);
				
				var btnBack = document.createElement('a');
								if(this.pagerButtonBack.useImage == false)
				{
					btnBack.appendChild(document.createTextNode(this.pagerButtonBack.altText));
				}
				else
				{
					var btnBackImg = document.createElement('img');
					btnBackImg.style.border = '0px';
					btnBackImg.alt = this.pagerButtonBack.altText;
					btnBackImg.src = this.pagerButtonBack.enabledImage;
					btnBackImg.title = this.pagerButtonBack.toolTip;
					btnBackImg.style.verticalAlign = 'middle';
					btnBack.appendChild(btnBackImg);
				}
				btnBack.className = this.pagerLinkClassName;
				btnBack.href='javascript:YkeClick()';
				btnBack.itemID = (currentPageIndex-1);
				btnBack.itemGrid = {grid: this};
				btnBack.onclick = function() {
					changePage(this);
				}
				spannavig.appendChild(btnBack);
			}
			
			var sep = document.createElement('span');
			sep.innerHTML = "&nbsp;&nbsp;"
			spannavig.appendChild(sep);
			
			if(currentPageIndex<pagesCount-1)
			{
				var btnNext = document.createElement('a');
				if(this.pagerButtonNext.useImage == false)
				{
					btnNext.appendChild(document.createTextNode(this.pagerButtonNext.altText));
				}
				else
				{
					var btnNextImg = document.createElement('img');
					btnNextImg.style.border = '0px';
					btnNextImg.alt = this.pagerButtonNext.altText;
					btnNextImg.src = this.pagerButtonNext.enabledImage;
					btnNextImg.title = this.pagerButtonNext.toolTip;
					btnNextImg.style.verticalAlign = 'middle';
					btnNext.appendChild(btnNextImg);
				}
				btnNext.className = this.pagerLinkClassName;
				btnNext.href='javascript:YkeClick()';
				btnNext.itemID = (currentPageIndex+1);
				btnNext.itemGrid = {grid: this};
				btnNext.onclick = function() {
					changePage(this);
				}
				spannavig.appendChild(btnNext);
				
				var sep = document.createElement('span');
				sep.innerHTML = "&nbsp;&nbsp;"
				spannavig.appendChild(sep);
				
				var btnLast = document.createElement('a');
				if(this.pagerButtonLast.useImage == false)
				{
					btnLast.appendChild(document.createTextNode(this.pagerButtonLast.altText));
				}
				else
				{
					var btnLastImg = document.createElement('img');
					btnLastImg.style.border = '0px';
					btnLastImg.alt = this.pagerButtonLast.altText;
					btnLastImg.src = this.pagerButtonLast.enabledImage;
					btnLastImg.title = this.pagerButtonLast.toolTip;
					btnLastImg.style.verticalAlign = 'middle';
					btnLast.appendChild(btnLastImg);
				}
				btnLast.className = this.pagerLinkClassName;
				btnLast.href='javascript:YkeClick()';
				btnLast.itemID = (pagesCount - 1);
				btnLast.itemGrid = {grid: this};
				btnLast.onclick = function() {
					changePage(this);
				}
				spannavig.appendChild(btnLast);
			}
			else
			{
				var btnNext = document.createElement('a');
				if(this.pagerButtonNext.useImage == false)
				{
					btnNext.appendChild(document.createTextNode(this.pagerButtonNext.altText));
				}
				else
				{
					var btnNextImg = document.createElement('img');
					btnNextImg.style.border = '0px';
					btnNextImg.alt = this.pagerButtonNext.altText;
					btnNextImg.src = this.pagerButtonNext.disabledImage;
					btnNextImg.title = this.pagerButtonNext.toolTip;
					btnNextImg.style.verticalAlign = 'middle';
					btnNext.appendChild(btnNextImg);
				}
				btnNext.className = this.pagerDisabledLinkClassName;
				spannavig.appendChild(btnNext);
				
				var sep = document.createElement('span');
				sep.innerHTML = "&nbsp;&nbsp;"
				spannavig.appendChild(sep);
				
				var btnLast = document.createElement('a');
				if(this.pagerButtonLast.useImage == false)
				{
					btnLast.appendChild(document.createTextNode(this.pagerButtonLast.altText));
				}
				else
				{
					var btnLastImg = document.createElement('img');
					btnLastImg.style.border = '0px';
					btnLastImg.alt = this.pagerButtonLast.altText;
					btnLastImg.src = this.pagerButtonLast.disabledImage;
					btnLastImg.title = this.pagerButtonLast.toolTip;
					btnLastImg.style.verticalAlign = 'middle';
					btnLast.appendChild(btnLastImg);
				}
				btnLast.className = this.pagerDisabledLinkClassName;
				spannavig.appendChild(btnLast);
			}
			
			td.appendChild(spannavig);
			

			td.appendChild(document.createTextNode('   |  '));
			
			var gotoLink = null;
			
			if(pagesCount<12)
			{
				
				renderPageNumber(td, 0, pagesCount, currentPageIndex, 
					this.pagerCurrentClassName, this.tooltipPageCurrent, this.pagerLinkClassName, this.tooltipPageLink, this);
			}
			else
			{
				
				gotoLink = document.createElement('a');
				
				
				var gotoLinkImg = document.createElement('img');
				gotoLinkImg.style.border = '0';
				gotoLinkImg.style.verticalAlign='middle';
				gotoLinkImg.src = this.pagerButtonGoto.enabledImage;
				gotoLinkImg.title = this.pagerButtonGoto.toolTip + "...";
				gotoLinkImg.alt = this.pagerButtonGoto.altText;
				
				gotoLink.appendChild(gotoLinkImg);
				gotoLink.href='javascript:YkeClick()';
				gotoLink.className = this.pagerLinkClassName;
				
				gotoLink.onclick = function()
				{
					changePageGotoPrompt(this);
				}
				
				
				td.appendChild(gotoLink);
				
				td.appendChild(document.createTextNode('   |  '));
				
				if(currentPageIndex < 5)
				{
					renderPageNumber(td, 0, 7, currentPageIndex, 
						this.pagerCurrentClassName, this.tooltipPageCurrent, this.pagerLinkClassName, this.tooltipPageLink, this);
					
					td.appendChild(document.createTextNode('...'));
					
					renderPageNumber(td, pagesCount-2, pagesCount, currentPageIndex, 
						this.pagerCurrentClassName, this.tooltipPageCurrent, this.pagerLinkClassName, this.tooltipPageLink, this);
				}
				else if (currentPageIndex > (pagesCount - 6))
				{
					renderPageNumber(td, 0, 2, currentPageIndex, 
						this.pagerCurrentClassName, this.tooltipPageCurrent, this.pagerLinkClassName, this.tooltipPageLink, this);
					
					td.appendChild(document.createTextNode('...'));
					
					renderPageNumber(td, pagesCount-7, pagesCount, currentPageIndex, 
						this.pagerCurrentClassName, this.tooltipPageCurrent, this.pagerLinkClassName, this.tooltipPageLink, this);
				}
				else
				{
					renderPageNumber(td, 0, 2, currentPageIndex, 
						this.pagerCurrentClassName, this.tooltipPageCurrent, this.pagerLinkClassName, this.tooltipPageLink, this);
					
					td.appendChild(document.createTextNode('...'));
					
					renderPageNumber(td, currentPageIndex-2, currentPageIndex+3, currentPageIndex, 
						this.pagerCurrentClassName, this.tooltipPageCurrent, this.pagerLinkClassName, this.tooltipPageLink, this);
					
					td.appendChild(document.createTextNode('...'));
					
					renderPageNumber(td, pagesCount-2, pagesCount, currentPageIndex, 
						this.pagerCurrentClassName, this.tooltipPageCurrent, this.pagerLinkClassName, this.tooltipPageLink, this);

				}
				
				
			}
		
			var tr = document.createElement('tr');
			
			
			//td.appendChild(_pagerDiv);
			td.setAttribute('colSpan', this.columns.length);	
			tr.appendChild(td);
			
			

			
			if(gotoLink != null)
			{
				gotoLink.itemGrid = {grid: this};
			}
			
			_table_body.appendChild(tr);
			
			var gotoTbx = null;
			
			// goto line gotoline
			if(this.showPagerGoto == true)
			{
				var trGT = document.createElement('tr');
				trGT.className = this.gotoLineClassName;
				var tdGT = document.createElement('td');
				tdGT.style.textAlign = 'right';
				
				
				var tbx = document.createElement('input');
				tbx.type='text';
				tbx.value = (currentPageIndex+1);
				tbx.style.width='30px';
				gotoTbx = tbx;
				
				var btn = document.createElement('input');
				btn.type='button';
				btn.className = 'button';
				btn.value='OK';
				btn.rel = {tbx: tbx, grid:this, maxpage:pagesCount};
				btn.onclick = function()
				{
					var val = this.rel.tbx.value;
					var retry = false;
					var toolarge = false;
					if((parseInt(val) > 0) == false) retry = true;
					else if (parseInt(val) > (this.rel.maxpage))
					{
						 retry =true;
						 toolarge = true;
					}
					
					var cleanval = Math.floor(val);
					if(cleanval != val) retry = true;
						
					if(retry)
					{
						this.rel.tbx.value = 0;
						if(toolarge==true)
						{
							this.rel.tbx.value = this.rel.maxpage;
						}
						this.rel.tbx.select();
						this.rel.tbx.focus();
					}
					else
					{
						if(this.rel.grid.dynamicDataSourceBuffer != null)
						{
							this.rel.grid.dynamicDataSourceBuffer = null;
						}
						this.rel.grid.pagerItemIndexStart = ( (cleanval-1) * this.rel.grid.pagerItemLength);
						this.rel.grid.showPagerGoto = false;
						this.rel.grid.Render();
					}
				}
				
				tdGT.appendChild(document.createTextNode(this.pagerButtonGoto.toolTip + ' : '));
				tdGT.appendChild(tbx);
				tdGT.appendChild(btn);
				
				
				tdGT.setAttribute('colSpan', this.columns.length);	
				trGT.appendChild(tdGT);	
				_table_body.appendChild(trGT);
			}
		}
		if(renderHTML==true)
		{
			_table.appendChild(_table_body);
			_htmlnode.appendChild(_table);
			
			
			if(gotoTbx != null)
			{
				try{
				gotoTbx.select();
				gotoTbx.focus();
				}
				catch(e){}
			}
		}
		//pageLoaded event created !
		if(this.pageLoaded != null)
			this.pageLoaded();
	}
	
	function renderPageNumber(htmlContainer, from, to, currentPageIndex, pagerCurrentClassName, tooltipPageCurrent, pagerLinkClassName, tooltipPageLink, gridInstance)
	{
		for(var i=from; i<to; i++)
		{
			var link = document.createElement('a');
			link.href='javascript:YkeClick()'
			link.appendChild(document.createTextNode((i+1)));
			if(currentPageIndex == i)
			{
				link.className = pagerCurrentClassName;
				link.title = tooltipPageCurrent + " ("+ (i+1) + ")";
			}
			else
			{
				link.className = pagerLinkClassName;
				link.title = tooltipPageLink + (i+1) +  "/" +  to;
			}
			link.itemID = i;
			link.itemGrid = {grid: gridInstance};
			
			link.onclick = function()
			{
				changePage(this);
			}
			htmlContainer.appendChild(link);
			var separator = document.createElement('span');
			separator.appendChild(document.createTextNode(' '));
			htmlContainer.appendChild(separator);
		}
	}
	
	function changePage(link)
	{
		//alert(link.itemID + "-" + link.itemGrid.grid.pagerItemLength );
		link.itemGrid.grid.showPagerGoto=false;
		link.itemGrid.grid.pagerItemIndexStart = (link.itemID) * link.itemGrid.grid.pagerItemLength;
		if(link.itemGrid.grid.dynamicDataSourceBuffer != null)
		{
			link.itemGrid.grid.dynamicDataSourceBuffer = null;
		}
		
		
		/*if(link.itemGrid.grid.pageChange != null)
			link.itemGrid.grid.pageChange();*/
		link.itemGrid.grid.Render();
		/*if(link.itemGrid.grid.pageLoaded != null)
			link.itemGrid.grid.pageLoaded();*/
		
		return false;
	}
	
	function changePageGotoPrompt(gotoLink)
	{
		gotoLink.itemGrid.grid.showPagerGoto = !gotoLink.itemGrid.grid.showPagerGoto;
		gotoLink.itemGrid.grid.Render();
		return false;
	}
	
	function sortHeaderClick()
	{		
		if(this.sorting.column != this.sorting.grid.sortColumn)
		{
			this.sorting.grid.sortColumn = this.sorting.column;
			this.sorting.grid.sortDesc = false;
		}
		else
		{
			this.sorting.grid.sortDesc = !this.sorting.grid.sortDesc;
		}
		if(this.sorting.grid.dynamicDataSourceBuffer != null)
		{
			this.sorting.grid.dynamicDataSourceBuffer = null;
		}
		this.sorting.grid.showPagerGoto=false;
		this.sorting.grid.Render();
		return false;
	}
	
	
	// in : cell object
	// out : html node
	function renderHeaderCell(cell, currentSortingColumn, currentSortingIsDesc, ascImg, descImg, tooltipSorting)
	{
		var span = document.createElement('span');
		
		var lbl = "";
		if(cell.header != null)
		{
			lbl = cell.header;
		}
		else
		{
			lbl = cell.member;
		}
		var label = document.createTextNode(lbl + " ");
		var a = document.createElement('a');
		a.appendChild(label);
		a.name='Id'+lbl;
		a.id='Id'+lbl;
		a.href= 'javascript:YkeClick()';
		a.title= tooltipSorting + lbl;
		span.appendChild(a);
		
		
		
		if(cell.member == currentSortingColumn)
		{
			var img = document.createElement('img');
			if (currentSortingIsDesc) 
				img.src = descImg;
			else
				img.src = ascImg;
			span.appendChild(img);
		}
		
		
		return span;
	}
	
	function renderCell(cellValue)
	{
		return document.createTextNode(cellValue);
	}
	

	function MakeLines(tableBody, start, count, columns, datasource, altLineFrequency, lineClassName, altLineClassName, pkColumnIndex)
	{
		var rows = {};
	
		// MAKE LINES
		var sclassName = lineClassName;
		var counting = 0;
		for (var i=start; i<count; i++)
		{
			
			
			if(counting == altLineFrequency)
			{
				if(sclassName == lineClassName)
				{
					sclassName = altLineClassName;
				}
				else
				{
					sclassName = lineClassName;
				}
				
				counting = 0;
			}
			
			
			var _tr = document.createElement('tr');
			_tr.className = sclassName;
			
			//alert(columns.length);
			var uniqueName = null;
			
			for(var j=0; j<columns.length; j++)
			{
				//alert(j + "a");
				
				
				if(j == pkColumnIndex)
				{
					uniqueName = datasource[i][columns[j].member];
				}
				
				
				var _td = document.createElement('td');
				
				var _spanContainer = null;
				
				if(columns[j].trim != null)
				{
					if(columns[j].trim==true) _spanContainer = document.createElement('div');
					else _spanContainer = document.createElement('span');
				}
				else
				{
					_spanContainer = document.createElement('span');
				}
				//alert(j + "b");
				try
				{
				if( columns[j].width != null)
				{
					_spanContainer.style.width= columns[j].width;
					_td.width=columns[j].width;
				}
				if(columns[j].height != null)
				{
					_spanContainer.style.height=columns[j].height;
				}
				}catch(e)
				{
					
				}
				// !!!!! 
				_spanContainer.style.height="14px";
				
				//alert(j + "c");
				if(columns[j].trim != null)
				{
					if(columns[j].trim == true) _spanContainer.style.overflow = 'hidden';
				
				}

				var memberName = columns[j].member;
				
				var cellValue = datasource[i][memberName];
				//alert(j + "d");
				
				if(columns[j].rendering == null)
				{
					//alert("pas rendering : go");
					// standard rendering
					var cell = renderCell(cellValue);
					if(columns[j].align == 'right')
					{
						_td.style.textAlign = 'right';
					}
					_spanContainer.appendChild( cell );
					//alert("pas rendering : done");	
				}
				else
				{
					//alert("rendering : go");
					// custom rendering
					var ret = columns[j].rendering(cellValue, datasource[i] );
					var cell;
					//if(typeof ret == 'string') //retreive string
					//{
					//	cell = document.createElement('span');
					//	cell.innerHTML = ret;
					//}
					//else // retreive html node
					//{
						cell = ret;
					//}
					
					
					_spanContainer.appendChild( cell );
					//alert("rendering : done");
				}
				_td.appendChild(_spanContainer);
				_tr.appendChild(_td);
				//alert(j + "z");
			}
			
			
			
			if(pkColumnIndex > -1)
			{
				rows[uniqueName] = _tr;
			}
			
			tableBody.appendChild(_tr);

		
			counting++;
			
		}
		return rows;
		// MAKE LINES END
	}
	
}

