/****** Constants used in the code that can be changed ******/
var PAGINATE_SORT_TABLE_CLASS="paginatesorttable";
var PAGINATE_NAVIGATE_CLASS="paginateNavigate";
var SORT_TABLE_CLASS="sorttable";
var SORT_COLUMN_INDEX;
var SORT_TEXT="TEXT";
var SORT_NUMBER="NUMBER";
var SORT_DATE="DATE_";
var SORT_CURRENCY="CURRENCY";
var SORT_NONE="NONE";
var SORT_DATE_FORMAT=SORT_DATE+"DD-MM-YYYY";

var SORT_ORDER_ATTRIBUTE="sortOrder";
var SORT_ASC="ASC";
var SORT_DES="DES";
// Default to ASC
var SORT_ORDER=SORT_ASC;
var INITIAL_SORT_COLUMN=0;

var EVEN_ROW_CLASS="searchresulttext";
var ODD_ROW_CLASS="searchresulttext";

var PAGE_SIZE=50;
var SELECTED_PAGE=1;
var IMG_PATH="./images/";
var HEADER_OFFSET=2;
var FOOTER_OFFSET=0;
var TOP_NAVIGATE=true;
var BOT_NAVIGATE=false;

setupEvent(window,"load",paginateSortTableInit,false);


// Method to add handler to an event of an object
// obj is the object to add handler
// eventName is the event to monitor. E.g. click, load
// handler is the function
// eventFlow indicates if event listener is treated as bubble up(false) or cascade down(true)
function setupEvent(obj,eventName, handler, eventFlow){
	// DOM uses addEventListener, IE uses attachEvent
	// Test if addEventListener/attachEvent is supported
	if(obj.addEventListener){
		obj.addEventListener(eventName,handler,eventFlow);
	} else if (obj.attachEvent) {
	      obj.attachEvent("on"+eventName, handler);
	    }
}

function paginateSortTableInit() {
	// Get all the tables that have class PAGINATE_SORT_TABLE_CLASS	
	// XHTML 1.0 and up element references are in uppercase, DOCTYPE of HTML 4.01 in lowercase
	var tables=document.getElementsByTagName("table");
	if(tables.length==0){
		tables=document.getElementsByTagName("TABLE");
	}			
	if(tables.length==0){
		//alert("No table to paginate and sort");
		return;
	}
	for(var i=0;i<tables.length;i++){
		//alert((tables[i].className).toLowerCase());
		if(tables[i].className.toLowerCase()==SORT_TABLE_CLASS){
			// Prepare the table
			//alert(tables[i].id)
			createTableHeader(tables[i]);
			updateAlternateTableRows(tables[i]);
		}
	else if(tables[i].className.toLowerCase()==PAGINATE_SORT_TABLE_CLASS){
			
			//alert(tables[i].id)
			
			var tableId=tables[i].id;
			var recordCount=tables[i].rows.length-1
			var pageCount=Math.ceil(recordCount/PAGE_SIZE);
			//alert(pageCount);
			if(pageCount<2){
				//alert("Less than 2 page");
				HEADER_OFFSET=0;				
			}
		else{
			HEADER_OFFSET=2;
		}
		
			createPageNavigation(tables[i]);
			createTableHeader(tables[i]);
			updateAlternateTableRows(tables[i]);
			
			navigatePage(tables[i].id,1);
			
		}
	}

}
function createPageNavigation(table){
	if(table==undefined){
		return;
	}
	var tableId=table.id;
	var recordCount=table.rows.length-1
	var pageCount=Math.ceil(recordCount/PAGE_SIZE);
	//alert(pageCount);
	if(pageCount<2){
		//alert("Less than 2 page");
		return;
	}
	
	var colspanNum=table.rows[0].cells.length;
	// Create page numbers
	var pageCountRow=table.insertRow(0);
	var pageCountCell=pageCountRow.insertCell(0);
	//pageCountCell.setAttribute("colSpan",colspanNum);
	//pageCountCell.setAttribute("class","paginateNavigate");
	//pageCountCell.innerHTML = recordCount+" matching record(s)";
	
	
	
	// Create top navigation
		if(TOP_NAVIGATE==true)
			createPageNavigationRow(table,pageCount,colspanNum,1);
		// Create bottom navigation
		if(BOT_NAVIGATE==true)
			createPageNavigationRow(table,pageCount,colspanNum,table.rows.length);

}
function createPageNavigationRow(table,pageCount,colspanNum,rowPos){

	var tableId=table.id;
	// Create page navigation
	var navigatePageNumberRow=table.insertRow(rowPos);
	var navigatePageNumberCell=navigatePageNumberRow.insertCell(0);
	navigatePageNumberCell.valign="top";
	navigatePageNumberCell.align="center";
	navigatePageNumberCell.height=30;
	
	var pageNumberColSpan,pageNavigateColSpan;
	if((colspanNum%2)==0){
		pageNumberColSpan=colspanNum/2;
		pageNavigateColSpan=colspanNum/2;
	}
	else{
		var halfCol=parseInt(colspanNum/2);
		pageNumberColSpan=halfCol;
		pageNavigateColSpan=halfCol+(colspanNum%2);
	}
	//alert(pageNumberColSpan);alert(pageNavigateColSpan);
	
	navigatePageNumberCell.setAttribute("colSpan",colspanNum);
	navigatePageNumberCell.setAttribute("class","searchresultpagination");
	createPageNumbers(tableId,navigatePageNumberCell,pageCount,"1");
	
	//var navigatePageCell=navigatePageNumberRow.insertCell(1);
	//navigatePageCell.border="none";
	//navigatePageCell.setAttribute("colSpan",pageNavigateColSpan);
	//navigatePageCell.setAttribute("align","right");
	createDirectNavigate(tableId,navigatePageNumberCell,pageCount,"1");	
	
}

// Method to create page numbers
function createPageNumbers(tableId,td,pageNum,selectedPage){
	//alert(tableId+" "+ pageNum+" "+selectedPage);
	var pageNumberSpan=document.createElement("span");
	pageNumberSpan.style.position="absolute";	
	pageNumberSpan.style.left=30;
	//alert(pageNumberSpan.style.top);
	pageNumberSpan.style.top="auto";
	td.appendChild(pageNumberSpan);
	var txt = document.createTextNode(" Page ");
	pageNumberSpan.appendChild(txt);
	var range=2;
	
	
	var frontOffSet=selectedPage-1;
	var backOffSet=pageNum-selectedPage;

	//alert(frontOffSet+" "+ backOffSet+" "+range );	
	
	if(frontOffSet>(2*range) ){
		var txt1 =document.createTextNode(".. ");
		pageNumberSpan.appendChild(txt1);
	}
			
	for(var i=1;i<=pageNum;i++ ){

		if(i==selectedPage){
			var elem =document.createElement("label");
			elem.setAttribute("class","pagination_selected_page");
			var selectedPageNode=document.createTextNode(i+" ");
			elem.appendChild(selectedPageNode);
			pageNumberSpan.appendChild(elem);
			
			
			
		}
		else{		
			if((i>selectedPage && i<=selectedPage+ (2*range)) || (i<selectedPage && i>=selectedPage-(2*range))){
				var elem =document.createElement("a");
				elem.setAttribute("href","javascript:navigatePage('"+tableId+"',"+i+")");
				elem.setAttribute("class","pagination");
				elem.innerHTML=i+" ";
				pageNumberSpan.appendChild(elem);
				//var txt =document.createTextNode("..");
				//td.appendChild(txt);
			}
			
			
			
		}
	}	
	
	if(backOffSet>(2*range) && backOffSet<pageNum){
		var txt =document.createTextNode("..");
		pageNumberSpan.appendChild(txt);
	}
	
//	alert(td.innerHTML);
}
// Method to create the Direct Navigation UI
function createDirectNavigate(tableId,td,pageNum,selectedPage){
	var directNavigateSpan=document.createElement("span");	
	directNavigateSpan.style.position="absolute";	
	directNavigateSpan.style.right=30;
	directNavigateSpan.style.top="auto";
	td.appendChild(directNavigateSpan);
	
	var space = document.createTextNode(" ");
	var space1 = document.createTextNode(" ");
	var space2 = document.createTextNode(" ");
	var space3 = document.createTextNode(" ");
	var space4 = document.createTextNode(" ");
	
	var navLeftEnd = document.createElement("img");
	var navLeft = document.createElement("img");
	var navLeftEndLink =document.createElement("a");
	var navLeftLink =document.createElement("a");
	
			
	if(selectedPage==1){
		navLeftEnd.setAttribute("src",IMG_PATH+"blue_left_end_faint.gif");
		navLeft.setAttribute("src",IMG_PATH+"blue_left_faint.gif");
		
		
		directNavigateSpan.appendChild(navLeftEnd);
		directNavigateSpan.appendChild(space);
		directNavigateSpan.appendChild(navLeft);
		//td.appendChild(navLeftEndLink);
	}
	else{
		navLeftEnd.setAttribute("src",IMG_PATH+"blue_left_end.gif");
		navLeft.setAttribute("src",IMG_PATH+"blue_left.gif");
		
		navLeftEndLink.setAttribute("href","javascript:navigatePage('"+tableId+"',"+1+")");
		navLeftEndLink.appendChild(navLeftEnd);
				
		navLeftLink.setAttribute("href","javascript:navigatePage('"+tableId+"',"+(parseInt(selectedPage)-1)+")");
		navLeftLink.appendChild(navLeft);
		
		directNavigateSpan.appendChild(navLeftEndLink);
		directNavigateSpan.appendChild(navLeftLink);
	}
	
	directNavigateSpan.appendChild(space1);
	
	// Create the current page number as input
	//var pageSelect = document.createElement("input");
	//pageSelect.setAttribute("type","input");
	//pageSelect.setAttribute("name",tableId);
	//pageSelect.setAttribute("value",selectedPage);
	//pageSelect.setAttribute("size","1");
	//pageSelect.setAttribute("class","pagination_form_field");
	//pageSelect.onchange=navigateInputPage;
	
	// Create the current page number as label
var pageSelect = document.createElement("label");
pageSelect.setAttribute("class","pagination");
pageSelect.innerHTML=selectedPage+" of "+pageNum+" Pages";

	//alert(pageSelect.getAttribute("onchange"));
	directNavigateSpan.appendChild(pageSelect);
	directNavigateSpan.appendChild(space2);
	
	
	var navRight = document.createElement("img");
	var navRightEnd = document.createElement("img");
	var navRightEndLink =document.createElement("a");
	var navRightLink =document.createElement("a");
	
	//alert(selectedPage);
	//alert(pageNum);
	if(selectedPage==pageNum){
		navRight.setAttribute("src",IMG_PATH+"blue_right_faint.gif");
		navRightEnd.setAttribute("src",IMG_PATH+"blue_right_end_faint.gif");
		directNavigateSpan.appendChild(navRight);
		directNavigateSpan.appendChild(space3);	
		directNavigateSpan.appendChild(navRightEnd);
	}
	else{
		
		navRight.setAttribute("src",IMG_PATH+"blue_right.gif");
		navRightEnd.setAttribute("src",IMG_PATH+"blue_right_end.gif");
		
		navRightEndLink.setAttribute("href","javascript:navigatePage('"+tableId+"',"+pageNum+")");
		navRightEndLink.appendChild(navRightEnd);
				
		navRightLink.setAttribute("href","javascript:navigatePage('"+tableId+"',"+(parseInt(selectedPage)+1)+")");
		navRightLink.appendChild(navRight);
		
		directNavigateSpan.appendChild(navRightLink);
		directNavigateSpan.appendChild(navRightEndLink);
	}
	
	
	
	//td.appendChild(navRight);
	//td.appendChild(space3);	
	//td.appendChild(navRightEnd);
	//td.appendChild(navRightEndLink);
	directNavigateSpan.appendChild(space4);
	
	//alert(td.innerHTML);
	
}
// Method to get the element that trigger this event
function navigateInputPage(evt){
	evt = (evt) ? evt : ((window.event) ? event : null);
    if (evt) {
       var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
       if (elem.nodeType == 3) {
           elem = elem.parentNode;
       }
       if (elem) {
           var val = elem.value;
           var tableName=elem.name;
           //alert(val+" "+tableName);
           if(!isNaN(parseInt(val))){
           		
           	if(validatePageNumber(tableName,val)==1){
           		//alert("validatePageNumber: "+validatePageNumber(tableName,val));
           		navigatePage(tableName,val);
          	}
          }
          // navigatePage(tableName,val);
           // perform more event processing here
       }
    }

	
}

// Method to remove all the child elements
function removeChildElements(parentNode){
	for(var j=parentNode.childNodes.length-1;j>=0;j--){
				parentNode.removeChild(parentNode.childNodes[j]);
			}
}
// Method to update the page navigation and direction navigation when page changes
function updatePageNumber(tableId,selectedPage){
	var table=$(tableId);
	//alert(table);
	if(table==undefined)
		return;
	var tableRows=table.rows;
	var recordCount=tableRows.length-HEADER_OFFSET-1-FOOTER_OFFSET;
	var pageCount=Math.ceil(recordCount/PAGE_SIZE);
	
	// Update top navigation
	if(TOP_NAVIGATE==true && pageCount>1){
	removeChildElements(tableRows[1].cells[0]);		
	createPageNumbers(tableId,tableRows[1].cells[0],pageCount,selectedPage);
	//removeChildElements(tableRows[1].cells[0]);	
	createDirectNavigate(tableId,tableRows[1].cells[0],pageCount,selectedPage);
}
	
	// Update bottom navigation
	
	if(BOT_NAVIGATE==true && pageCount>1){
	removeChildElements(tableRows[tableRows.length-1].cells[0]);		
	createPageNumbers(tableId,tableRows[tableRows.length-1].cells[0],pageCount,selectedPage);
	//removeChildElements(tableRows[tableRows.length-1].cells[1]);	
	createDirectNavigate(tableId,tableRows[tableRows.length-1].cells[0],pageCount,selectedPage);
}

}
// Method called when the page changes
function navigatePage(tableId,selectedPage){
	//alert(tableName+" "+selectedPage);
	
		showPage(tableId,selectedPage);
		updatePageNumber(tableId,selectedPage);
	
}
function validatePageNumber(tableName,selectedPage){
	var tables=document.getElementsByTagName("table");
	if(tables.length==0){
		tables=document.getElementsByTagName("TABLE");
	}	
	for(var tableCount=0;tableCount<tables.length;tableCount++){
		var childName=tables[tableCount].id;
		if(childName!=undefined){
			if(childName==tableName){
				var numRows=tables[tableCount].rows.length;
				var maxPage=Math.ceil((numRows-1)/PAGE_SIZE);
				if(selectedPage<1 || selectedPage>maxPage){
						alert("Invalid Page number");
					return 0;
				}
			}
		}
	}
	return 1;
}

// Method to show the corressponding rows of the table
function showPage(tableId,selectedPage){
	//alert("showPage: "+tableId+" selectedPage: "+selectedPage);
	var table=$(tableId);
	//alert(table);
	if(table==undefined)
		return;
	var tableRows=table.rows;



				var numRows=(tableRows.length)-HEADER_OFFSET-1-FOOTER_OFFSET;
				//alert(numRows);
				var maxPage=Math.ceil((numRows-1)/PAGE_SIZE);
				//alert(maxPage);
				var start=((selectedPage-1)*PAGE_SIZE)+1;
				var end=selectedPage*PAGE_SIZE;
				//alert(start+" "+end);
				for(var j=HEADER_OFFSET+1;j<tableRows.length-FOOTER_OFFSET;j++){	
					var pos=j-HEADER_OFFSET;	
					//alert(pos);			
					if(pos<start || pos>end){
						tableRows[j].style.display = 'none';
						//alert(j);
					}
				else{
						tableRows[j].style.display = '';
						
					}
				}
			SELECTED_PAGE=selectedPage;


	
		
		//alert(childNodes[i].name);
		

	
	
}

// Method to create the header for the table, called before creating the navigation links
function createTableHeader(table){
	if(table.rows.length==0)
		return;
	
	
	var headerRow=table.rows[HEADER_OFFSET];
	if(headerRow==undefined)
	return;
	for(var i=0;i<headerRow.cells.length-FOOTER_OFFSET;i++){
		var cell=headerRow.cells[i];
		var sInnerHTML=new String(trim(cell.innerHTML));
		//alert(sInnerHTML);
		//alert(sInnerHTML.indexOf("input"));
		//alert(sInnerHTML.indexOf("INPUT"));
		
		// Check if the sort logic is determined in the axis attribute
		var axis=trim(cell.axis);
		//alert("|"+axis+"|");
		//alert("|"+cell.axis+"|");
		
		// Column is sortable only when there is category defined in the axis
		if(axis!=""){
			// Add the sort gif except for last column
			if(axis!="NONE")
			{
				var innerTag='<a href="javascript:" class="table_header" onclick="sortTable(this);">'+sInnerHTML;
				if(INITIAL_SORT_COLUMN==i)
				{
					innerTag+='<SPAN '+SORT_ORDER_ATTRIBUTE+'="'+SORT_ASC+'"><img src="'+IMG_PATH+'Uarrow.gif"/></SPAN>';
				}
				innerTag+='</a>';
				cell.innerHTML=innerTag;
				//cell.innerHTML='<a href="javascript:sortTable(this)" class="table_header" onclick="sortTable(this);">'+sInnerHTML+'<SPAN '+SORT_ORDER_ATTRIBUTE+'="'+SORT_ASC+'"><img src="'+IMG_PATH+'Uarrow.gif"/></SPAN></a>';
				
			}
			SORT_COLUMN_INDEX=0;
		}
		//alert(cell.innerHTML);
	
	}
}

// Method to change the class of all the rows in the table except header
function updateAlternateTableRows(table){
	var rows=table.rows;
	if(rows.length<1)
		return;
	
	//alert(rows.length);
	for(var i=HEADER_OFFSET+1;i<rows.length-FOOTER_OFFSET;i++){
		
		updateAlternateRow(rows[i],i);
	}
}

// Method to change the class of the row based on the row index-row_even, row_odd
function updateAlternateRow(row, rowIndex){
	var index=Number(rowIndex);
	if(isNaN(index))
		return;
	
	if(index%2==0){
		// Even
		row.className=EVEN_ROW_CLASS;
	}
	else{
		// Odd
		row.className=ODD_ROW_CLASS;
		
	}	
}

// Method to sort the table based on the clicked column
function sortTable(anchorObj){
	//alert("sortTable");
	//alert(anchorObj.parentNode.parentNode.parentNode.tagName);
	// <TABLE>
	// <TBODY> or <THEAD>
	// <TR>
	// <TH> or <TD>
	// <A>
	if(anchorObj.nodeType==undefined)
	{	
		return;
	}
	// Indicates if first time sorting the column. if yes, sort. no, just do reverse.
	//var resort=updateSortSPAN(anchorObj);
	updateSortSPAN(anchorObj);
	//alert(anchorObj.innerHTML);
		
	// Get reference to the table
	var table=getTable(anchorObj);
	if(table==undefined){
		return;
	}

	var rowsToSort=new Array();
	var tableRows=table.rows;
	// First row is the header.
	// Make a copy of the rows that will be used for sorting
	for(var i=HEADER_OFFSET+1;i<tableRows.length-FOOTER_OFFSET;i++){
		//alert(tableRows[i].cells[0].innerText);
		rowsToSort[i-(HEADER_OFFSET+1)]=tableRows[i];
	}
	
	// Determine the column to sort
	var resort=false;
	//alert(SORT_COLUMN_INDEX);
	//alert(getSortColumnIndex(tableRows,anchorObj));
	if(SORT_COLUMN_INDEX==getSortColumnIndex(tableRows,anchorObj))
		resort=true;
	
	SORT_COLUMN_INDEX=getSortColumnIndex(tableRows,anchorObj);
	
	if(SORT_COLUMN_INDEX==undefined)
		return;
		
		//alert(anchorObj.parentNode.axis);		

		// Determine the sort logic
		var axis=trim(anchorObj.parentNode.axis).toUpperCase();
		if(axis==""){
			return;
		}
		var testString="Date_";
		//alert(SORT_DATE);
		//alert(axis);
		if(axis==SORT_TEXT){
			if(resort){
				rowsToSort.reverse();
			}else
				{
					rowsToSort.sort(sortTEXT);
				}
		}
		else if(axis==SORT_NUMBER){
			if(resort){
				rowsToSort.reverse();
			}else
				{			
					rowsToSort.sort(sortNUMERIC);
				}
		}
		else if(axis==SORT_CURRENCY){
			if(resort){
				rowsToSort.reverse();
			}else
				{
					rowsToSort.sort(sortNUMERIC);
				}
		}
		else if(axis.indexOf(SORT_DATE)==0){
			//alert("DATE");
			SORT_DATE_FORMAT=axis;
			if(resort){
				rowsToSort.reverse();
			}else
					{
				rowsToSort.sort(sortDATE);
			}
		}
		
		// Append back the rows to the tbody.
		var tbody=table.tBodies[0];
		//var tbody=table;//anchorObj.parentNode.parentNode.parentNode.parentNode	;
		//alert(table.tBodies[0].tagName);
		
		
		for(var k=1;k<=FOOTER_OFFSET;k++){
			rowsToSort[rowsToSort.length]=tbody.rows[tbody.rows.length-k]
			//alert(k);
		}
			
		for(var i=0;i<rowsToSort.length;i++){
			tbody.appendChild(rowsToSort[i]);
			updateAlternateRow(rowsToSort[i],i+1);
		}
	//alert(testString.match(SORT_DATE));
	//alert(anchorObj.parentNode.axis);
	//showPage(table.id,SELECTED_PAGE);
	navigatePage(table.id,1);
}

// Method to determine the cell position of the clicked header
function getSortColumnIndex(tableRows,anchorObj){
	// First row is the header, check each cell to determine which column to sort
	
	for(var i=0;i<tableRows[HEADER_OFFSET].cells.length;i++){		
		if(tableRows[HEADER_OFFSET].cells[i]==anchorObj.parentNode){
			
			return i;
		}
	}
}

// Method to return the reference of the table where the header is clicked
function getTable(anchorObj){
	var table=anchorObj.parentNode.parentNode.parentNode.parentNode;
	
	var tableTag=new String("table");
	if(table.tagName==tableTag || table.tagName==tableTag.toUpperCase() || table.tagName==tableTag.toLowerCase()){
		return table;
	}
}

/****** Methods to format the data ******/
// Method to return string with leading and trailing spaces
function trim(string){
	if(string==undefined){
		return "";
	}
	var regExpr ='/^\s*|\s*$/g';	
	return string.replace(regExpr,'');
}

// Method to return numeric part of a string.
// Remove comma, space and non digits
function formatNumeric(string){
	var output=string;
	var expr=/\s*/g;
	output=output.replace(expr,"");
	expr=/,*/g;
	output=output.replace(expr,"");
	
	expr=/[-]*[0-9]+[.]*[0-9]*/;
	output=output.match(expr);
	if(!isNaN(output))
		return output;
	else 
		return null;
}

// Method to return the date object based on the Date Format and Date String
// Date Format should start with SORT_DATE, Date String does not start with SORT_DATE
// Supports Date Group-[day(DD), month(MM or MM), year(YY or YYYY)], Time Group-[hour(hh), minute(mm), second(ss)]
// Case Sensitive
// Each element in the group must be provided. E.g. Must provide day and month and year for Date Group. 
// Must provide hour and minute and second for Time Group
function getDateFormat(dateFormat,dateString){
	dateFormat=trim(dateFormat);
	dateString=trim(dateString);
	//alert(dateFormat);
	//alert(dateString);
	//alert(SORT_DATE);
	
	var startPos=SORT_DATE.length;
	var strLen=dateFormat.length;
	var format=dateFormat.substring(startPos,strLen);
	//alert(startPos);
	//alert(strLen);
	//alert(format);
	
	var dayFormat="";
	var monthFormat="";
	var yearFormat="";
	var hourFormat="";
	var minuteFormat="";
	var secondFormat="";
	
	var day="";
	var month="";
	var year="";
	var hour="";
	var minute="";
	var second="";
	
	//alert(format);
	for(var i=0;i<format.length;i++){
		
		if(format.charAt(i)=="D"){
			//alert("D at char:"+i);
			if(format.charAt(i+1)=="D"){
				dayFormat="DD";
				day=dateString.substring(i,i+2);
				i++;
			}
		}
		else if(format.charAt(i)=="M"){
			if(format.charAt(i+1)=="M"){
				monthFormat="MM";
				month=dateString.substring(i,i+2);
				i++;
				if(format.charAt(i+1)=="M"){
					monthFormat="MMM";
					month=dateString.substring(i-1,i+2);
					i++;
				}
			}
		}
		else if(format.charAt(i)=="Y"){
			if(format.charAt(i+1)=="Y"){
				yearFormat="YY";
				year=dateString.substring(i,i+2);
				i++;
				if(format.charAt(i+1)=="Y" && format.charAt(i+2)=="Y"){
					yearFormat="YYYY";
					year=dateString.substring(i-1,i+3);
					i+=2;
				}
			}
		}
		else if(format.charAt(i)=="h"){
			if(format.charAt(i+1)=="h"){
				hourFormat="hh";
				hour=dateString.substring(i,i+2);
				i++;
			}
		}
		else if(format.charAt(i)=="m"){
			if(format.charAt(i+1)=="m"){
				minuteFormat="mm";
				minute=dateString.substring(i,i+2);
				i++;
			}
		}
		else if(format.charAt(i)=="s"){
			if(format.charAt(i+1)=="s"){
				secondFormat="ss";
				second=dateString.substring(i,i+2);
				i++;
			}
		}
	}
	
	//alert("|"+dayFormat+"|");
	//alert("|"+monthFormat+"|");
	//alert("|"+yearFormat+"|");
	//alert("|"+hourFormat+"|");
	//alert("|"+minuteFormat+"|");
	//alert("|"+secondFormat+"|");
	//alert("day|"+day+"|");
	//alert("month|"+month+"|");
	//alert("year|"+year+"|");
	//alert("hour|"+hour+"|");
	//alert("minute|"+minute+"|");
	//alert("second|"+second+"|");
	
	if(yearFormat.length>0 && monthFormat.length==2 && dayFormat.length==2){
		// Cannot use parseInt because parseInt("08") return 0 instead of 8
		var iyear=Number(year);
		var imonth=Number(month);
		var iday=Number(day);
		
		
		if(!isNaN(iyear) && !isNaN(imonth) && !isNaN(iday)){
			
			if(hourFormat.length==2 && minuteFormat.length==2 && secondFormat.length==2){
				var ihour=Number(hour);
				var iminute=Number(minute);
				var isecond=Number(second);
				
				if(!isNaN(ihour) && !isNaN(iminute) && !isNaN(isecond)){
					return new Date(iyear,imonth-1,iday,ihour,iminute,isecond);
				}
			}
			else{
				//alert(iday);
				//alert(imonth);
				//alert(iyear);
				return new Date(iyear,imonth-1,iday);
			}
			
			
		}
	}

	else if(yearFormat.length>0 && monthFormat.length==3 && dayFormat.length==2){
		//alert("MMM");
		var iyear=Number(year);
		var iday=Number(day);
		
		if(!isNaN(iyear) && !isNaN(iday)){
			if(hourFormat.length==2 && minuteFormat.length==2 && secondFormat.length==2){
				var ihour=Number(hour);
				var iminute=Number(minute);
				var isecond=Number(second);
				
				if(!isNaN(ihour) && !isNaN(iminute) && !isNaN(isecond)){
					return new Date(month+" "+day+", "+year+" "+hour+":"+minute+":"+second);
				}
				
			}
				else{
					return new Date(month+" "+day+", "+year);
			}
		}
	
	}
	return null;
	
}

/****** Methods to sort the rows ******/
// Method to determine sort order
function sortTEXT(a,b){
	//alert(a.cells[SORT_COLUMN_INDEX].textContent);
	var firstText;
	var secondText;
	if(navigator.appName=="Microsoft Internet Explorer"){
		firstText=trim(a.cells[SORT_COLUMN_INDEX].innerText).toLowerCase();
		secondText=trim(b.cells[SORT_COLUMN_INDEX].innerText).toLowerCase();
	}
	else{
		firstText=trim(a.cells[SORT_COLUMN_INDEX].textContent).toLowerCase();
			secondText=trim(b.cells[SORT_COLUMN_INDEX].textContent).toLowerCase();
		
	}
	//alert(firstText);
	//alert(secondText);
	if(firstText==null || secondText==null)
		return 0;
		
	if(firstText<secondText){
		//if(SORT_ORDER==SORT_ASC)
			return -1;
		//else
			//return 1;
	}
	else if(firstText>secondText){
		//if(SORT_ORDER==SORT_ASC)
			return 1;
		//else
			//return -1;
	}		
	else
		return 0;	
}

// Method to determine sort order
function sortNUMERIC(a,b){
	var firstText;
	var secondText;
	if(navigator.appName=="Microsoft Internet Explorer"){
		firstText=trim(a.cells[SORT_COLUMN_INDEX].innerText);
		secondText=trim(b.cells[SORT_COLUMN_INDEX].innerText);
	}
	else{
		firstText=trim(a.cells[SORT_COLUMN_INDEX].textContent);
		secondText=trim(b.cells[SORT_COLUMN_INDEX].textContent);
		
	}
	//var firstText=trim(a.cells[SORT_COLUMN_INDEX].innerText);
	//var secondText=trim(b.cells[SORT_COLUMN_INDEX].innerText);
	
	var firstItem=parseFloat(formatNumeric(firstText));
	var secondItem=parseFloat(formatNumeric(secondText));
	
	if(firstItem==null || secondItem==null)
		return 0;
	
	if(firstItem<secondItem){
		//if(SORT_ORDER==SORT_ASC)
			return -1;
		//else
			//return 1;
	}
	else if(firstItem>secondItem){
		//if(SORT_ORDER==SORT_ASC)
			return 1;
		//else
			//return -1;
	}		
	else
		return 0;	
	
}

// Method to determine sort order
function sortDATE(a,b){
var firstText;
	var secondText;
	if(navigator.appName=="Microsoft Internet Explorer"){
		firstText=trim(a.cells[SORT_COLUMN_INDEX].innerText);
		secondText=trim(b.cells[SORT_COLUMN_INDEX].innerText);
	}
	else{
		firstText=trim(a.cells[SORT_COLUMN_INDEX].textContent);
		secondText=trim(b.cells[SORT_COLUMN_INDEX].textContent);
		
	}
	
	var firstItem=getDateFormat(SORT_DATE_FORMAT,firstText).getTime();
	var secondItem=getDateFormat(SORT_DATE_FORMAT,secondText).getTime();
	
	//alert(firstNum);
	//alert(secondNum);
	
	if(firstItem==null || secondItem==null)
		return 0;
	
	if(firstItem<secondItem){
		//if(SORT_ORDER==SORT_ASC)
			return -1;
		//else
			//return 1;
	}
	else if(firstItem>secondItem){
		//if(SORT_ORDER==SORT_ASC)
			return 1;
		//else
			//return -1;
	}		
	else
		return 0;	
	
}

/****** Methods to handle the SPAN Object ******/
// Method to get SPAN object that specify the sort order
// return SPAN object otherwise undefined if not found
function getSortSPAN(anchorObj){
	var childNodes=anchorObj.childNodes;
	if(childNodes==null || childNodes==undefined)
		return;
	for(var i=0;i<childNodes.length;i++){
		var child=childNodes[i];
		var nodeType=child.nodeType;
		var nodeName=child.nodeName.toUpperCase();
		// ELEMENT_NODE: value of 1
		if(nodeType==1){
			if(nodeName=="SPAN"){
				//alert(child.getAttribute(SORT_ORDER_ATTRIBUTE));
				return child;
			}
		}
	}
	
}
// Method to get the sort order of the SPAN object that specify the sort order
// Return sort order, otherwise null
function getSortOrder(anchorObj){
	var sortSPAN=getSortSPAN(anchorObj);
	if(sortSPAN!=undefined){
		//alert(sortSPAN);
		return sortSPAN.getAttribute(SORT_ORDER_ATTRIBUTE);
	}
}
// Method to remove SPAN object that specify the sort order
function removeSortSPAN(anchorObj){
	var sortSPAN=getSortSPAN(anchorObj);
	if(sortSPAN!=undefined){
		//alert(sortSPAN);
		anchorObj.removeChild(sortSPAN);
	}
}
// Method to remove all SPAN object that specify the sort order
function removeAllSortSPAN(){
	var spanElements=document.getElementsByTagName("SPAN");
	if(spanElements.length==0){
		spanElements=document.getElementsByTagName("span");
	}
	for(var i=spanElements.length-1;i>=0;i--){
		var spanElement=spanElements[i];
		var sortOrder=spanElement.getAttribute(SORT_ORDER_ATTRIBUTE);
		//alert(sortOrder);
		if(sortOrder!=null){
			var parentNode=spanElement.parentNode;
			//alert(parentNode.tagName);
			parentNode.removeChild(spanElement);
		}
	}	
	//alert(document.getElementsByTagName("SPAN").length);	
}
// Method to update the SPAN Object, return boolean to indicate resort. 
// false mean first time sorting and true means resorting
function updateSortSPAN(anchorObj){
	var sortOrder=getSortOrder(anchorObj);
	//alert(sortOrder);
	removeAllSortSPAN();
	//alert("Removed");
	if(sortOrder==null || sortOrder==undefined){
		//removeAllSortSPAN();
		toggleSortSPAN(anchorObj,SORT_ASC);
		//SORT_ORDER=SORT_ASC;
	}
	else{
		if(sortOrder.toUpperCase()==SORT_ASC){
			// change to desc
			toggleSortSPAN(anchorObj,SORT_DES);
			//SORT_ORDER=SORT_DES;
		}
		else{
			toggleSortSPAN(anchorObj,SORT_ASC);
			//SORT_ORDER=SORT_ASC;
		}		
		return true;
	}
	return false;
}
// Method to update the SPAN Object from ASC to DESC or vice versa and set SORT_ORDER
function toggleSortSPAN(anchorObj, sortOrder){
	//alert(anchorObj+" "+sortOrder);
	//alert("sortOrder: "+sortOrder);
	//alert("anchorObj: "+anchorObj.innerHTML);
	//removeSortSPAN(anchorObj);
	removeAllSortSPAN();

	if(sortOrder.toUpperCase()==SORT_ASC){
		//alert("sortOrder: "+sortOrder);
		var span =document.createElement("SPAN");
		var ascImg =document.createElement("img");
		span.setAttribute(SORT_ORDER_ATTRIBUTE,SORT_ASC);
		ascImg.setAttribute("src",IMG_PATH+"Uarrow.gif");
		span.appendChild(ascImg);		
		anchorObj.appendChild(span);
		anchorObj.innerHTML		
		//alert("appendChild" +anchorObj.innerHTML);
		SORT_ORDER=sortOrder;		
	}
	else if(sortOrder.toUpperCase()==SORT_DES){
		
		var span1 =document.createElement("SPAN");
		var desImg =document.createElement("img");
		span1.setAttribute(SORT_ORDER_ATTRIBUTE,SORT_DES);
		desImg.setAttribute("src",IMG_PATH+"Darrow.gif");
		span1.appendChild(desImg);
		anchorObj.appendChild(span1);
		anchorObj.innerHTML
		//alert("appendChild" +anchorObj.innerHTML);		
		SORT_ORDER=sortOrder;
		//alert("anchorObj: "+anchorObj.innerHTML);
	}	
else
	{
		//alert("Error");
	}
}





