/*
'Author					: Stefan Kruger
'Date Created			: 05-Apr-2006
'Last Changed by		: Stefan Kruger
'Date Last Changed		: 23-Jun-2006
'Version				: 1.0.21062006
'Comments/Changes:
'Date:			Person:					Desc:
'------------------------------------------------------------------------------------------------------
'05-Apr-2006	Stefan Kruger			Created file from aw102 template
'17-May-2006	Stefan Kruger			Added security database toggle ability
'21-Jun-2006	Stefan Kruger			Switched to Cellshack look and feel
'23-Jun-2006	Stefan Kruger			Added tooltip

'ToDo List:
'Date:			Person:					Desc:
'------------------------------------------------------------------------------------------------------
*/

//////////////////////////////////////////////////////////////////////////////////////////////
//DEFINITIONS
//////////////////////////////////////////////////////////////////////////////////////////////

//Definitions of grid slot data
var array_of_grids = new Array();
var array_of_gridtables = new Array();
var array_of_gridnames = new Array();
var array_of_gridtitles = new Array();
var array_of_gridsubtitles = new Array();
var array_of_griddivs = new Array();
var array_of_gridurls = new Array();
var array_of_gridcompids = new Array();
var array_of_gridfilterdata = new Array();
var array_of_gridfilterindices = new Array();
var array_of_gridsecurityusage = new Array();
/*NEW*/
var array_of_gridadvancedsearchcount = new Array();
var array_of_gridsearchmodestatus = new Array();
var array_of_gridlastsearchmodestatus = new Array();
var array_of_gridlaststandardsearchstring = new Array();
var array_of_gridlastadvancedsearchstring = new Array();
var array_of_gridadvancedsearchfielddisplaynames = new Array();
var array_of_gridadvancedsearchfieldnames = new Array();
var array_of_gridadvancedsearchfieldmodifiers = new Array();
var array_of_griddisplaymodes = new Array();
/*END NEW*/
var array_of_columnnames = new Array();
var array_of_fieldnames = new Array();
var array_of_colorders = new Array();
var array_of_actions = new Array();
var array_of_searchstoppers = new Array();
var grid_num = 0;

//Definition of grid elements
var standardSearchWrappingDiv = "standardSearch";
var standardSearchInputName = "searchString";
var advancedSearchWrappingDiv = "advancedSearch";
var advancedSearchInnerWrappingDiv = "advancedSearchInner";
var advancedSearchRowWrappingDiv = "adSearchRow";
var advancedSearchRowFieldSelect = "fieldSelect";
var advancedSearchRowOpSelect = "opSelect";
var advancedSearchRowSearchValue = "searchValue";
var advancedSearchRowBoolSelect = "boolSelect";
var advancedSearchCalendarSpace = "calendarSpace";

var calendarmessage = "click here to select a date";
//Constant content vars
var filterwarning = "<span class=\"warning\">Large amount of data present - Filtering of data may be slow</span>";

//////////////////////////////////////////////////////////////////////////////////////////////
//UTILITY FUNCTIONS
//////////////////////////////////////////////////////////////////////////////////////////////
/*
A function to check if grid with a specififed name currently exists.
Returns the gridIndex/gridObject of the first instance of the specified gridname
or -1/null if a matching grid is not found respectively.
indexOrObject : true --> return index of grid
indexOrObject : false --> return grid object itself
*/
function getGrid(gridName,indexOrObject){
	//Return index
	if (indexOrObject) {
		for (i = 0; i < array_of_gridnames.length; i++){
			if (array_of_gridnames[i] == gridName){
				return i;
			}
		}
		return -1;
	}
	//Return object
	else {
		for (i = 0; i < array_of_gridnames.length; i++){
			if (array_of_gridnames[i] == gridName){
				return array_of_grids[i];
			}
		}
		return null;
	}
}

/*
A function to check if a specified column exists in a specified grid.
Returns the column id of the first instance of the specified columnname in the grid
or -1 if a matching column is not found.
If byNameOrByField is true --> Search columnname array
If byNameOrByField is false --> Search field array
*/
function getIDForColumnName(gridID,columnName,byNameOrByField){
	var columnList;
	try {
		if (byNameOrByField) {
			columnList = array_of_columnnames[gridID]
		}
		else {
			columnList = array_of_fieldnames[gridID];
		}
	}
	catch (ex) {}
	if (columnList) {
		if (columnList.length) {
			for (c = 0; c < columnList.length; c++){
				if (columnList[c].toLowerCase() == columnName.toLowerCase()) {
					return c;
				}
			}
		}
	}
	return -1;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//CONTENT CREATION FUNCTIONS
//////////////////////////////////////////////////////////////////////////////////////////////
/*
Function to generate a column data structure for the grid
*/
function createGridDataStructure(componentID,gridID,displayMode,isModal){
	var loadGridStructure = function (oXML) {
		var retvalue = oXML.responseText;
		var split = retvalue.split(";");
		if (split.length == 4/*5*/){
			array_of_columnnames[gridID] = eval(split[0]);
			array_of_fieldnames[gridID] = eval(split[1]);
			array_of_colorders[gridID] = eval(split[2]);
		}
		else {
			//This error is caught in the grid function itself later on.
		}
		hideLoading();
		oXML = null;
	}
	var pathchange = "";
	if (isModal) {
		pathchange = modalpathchange;
	}
	hiddenSubmit(pathchange + "bin/buildgrid.asp","componentid=" + componentID + "&displaymode=" + displayMode,loadGridStructure,0,null,null,false);
}

/*
Function to create a header for a grid
*/
function createHeader(gridID,isModal){
	var output = "";
	if (isModal){
		output = "";
	}
	else {
		output = "<div class=\"margin_9\"></div><div class=\"header_1 margin_2\"><div class=\"float_left curve_1\"><img src=\"images/header_1.gif\" border=\"0\"></div><div class=\"float_left text_section_1\"><span class=\"default_header head_1\">" + array_of_gridtitles[gridID] + "</span></div><div class=\"float_right arrows_1\"><img src=\"images/header_2.gif\" border=\"0\"></div><div class=\"theplug\"><!--IE FIX--></div></div>";
	}
	return output;
}

/*
Function to create a sub-header for a grid
*/
function createSubHeader(gridID,isModal){
	var output = "";
	if (isModal || array_of_gridsubtitles[gridID].toString().length <= 0){
		output = "";
	}
	else {
		output = "<div class=\"margin_5\"></div><div class=\"header_2 margin_2\"><div class=\"float_left\"><img src=\"images/header_arrow_1.gif\" border=\"0\"></div><div class=\"float_left\"><span class=\"default_sub_header head_1\">" + array_of_gridsubtitles[gridID] + "</span></div><div class=\"theplug\"><!--IE FIX--></div></div>";
	}
	return output;
}

/*
Function to generate search area for the grid
*/
function createSearch(gridID,prevSearch,isModal,showStandardSearch){
	var pathchange = "",displaystr = "";
	if (isModal) {
		pathchange = modalpathchange;
	}
	if (!(showStandardSearch)) {
		displaystr = " style=\"display:none;\"";
	}
	//return "<div id=\"" + standardSearchWrappingDiv + gridID.toString() + "\" class=\"searchoutsidewrapper\"" + displaystr +"><div class=\"searchinsidewrapper\"><div><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td width=\"30\"></td><td height=\"24\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" height=\"24\" align=\"left\"><tr><td><img src=\"images/but_left.gif\"></td><td class=\"generic_button_tile\" height=\"24\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td><a href=\"javascript:void(0)\" onclick=\"checkSearch(" + gridID + "," + isModal + ",null)\" class=\"link_form_text link_hover_text_1\">search</a></td></tr><tr><td height=\"5\"></td></tr></table></td><td><img src=\"images/but_right.gif\"></td><td><img src=\"images/but_left.gif\"></td><td class=\"generic_button_tile\" height=\"24\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td><a href=\"javascript:void(0)\" onclick=\"toggleGridSearch(" + gridID + "," + isModal + ")\" class=\"link_form_text link_hover_text_1\">switch to advanced search</a></td></tr><tr><td height=\"5\"></td></tr></table></td><td><img src=\"images/but_right.gif\"></td></tr></table></td></tr></table></div><div><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"178\"><tr><td><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"178\"><tr><td width=\"36\"></td><td width=\"142\"><input onkeydown=\"checkSearch(" + gridID + "," + isModal + ",event)\" id=\"" + standardSearchInputName + gridID.toString() + "\" autocomplete=\"off\" value=\"" + prevSearch + "\" class=\"common_input input_width_7\"/></td></tr></table></td></tr></table></div></div></div>";
	return "<div class=\"margin_11\"></div><div id=\"" + standardSearchWrappingDiv + gridID.toString() + "\" class=\"content_col_1 searchoutsidewrapper\"" + displaystr +"><div class=\"searchinsidewrapper\"><div class=\"float_left shuffle_col_1\"><input onkeydown=\"checkSearch(" + gridID + "," + isModal + ",event)\" id=\"" + standardSearchInputName + gridID.toString() + "\" autocomplete=\"off\" value=\"" + prevSearch + "\" class=\"common_input form_element_width_auto\"></div><div class=\"float_left\"><a href=\"javascript:void(0)\" onclick=\"checkSearch(" + gridID + "," + isModal + ",null)\" class=\"but_1 menu_indent_1\">search</a></div><div class=\"float_left\"><a href=\"javascript:void(0)\" onclick=\"toggleGridSearch(" + gridID + "," + isModal + ")\" class=\"but_1 menu_indent_1\">advanced search</a></div><div class=\"theplug\"><!--IE FIX--></div></div></div>";
}

/*
Function to generate advanced search area for the grid
*/
function createAdvancedSearch(gridID,isModal,showAdvancedSearch){
	var pathchange = "",displaystr = "";
	if (isModal) {
		pathchange = modalpathchange;
	}
	if (!(showAdvancedSearch)) {
		displaystr = " style=\"display:none;\"";
	}
	//return "<div id=\"" + advancedSearchWrappingDiv + gridID.toString() + "\" class=\"advancedsearch\"" + displaystr + "><div><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td width=\"30\"></td><td height=\"24\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" height=\"24\" align=\"left\"><tr><td><img src=\"images/but_left.gif\"></td><td class=\"generic_button_tile\" height=\"24\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td><a href=\"javascript:void(0)\" onclick=\"checkSearch(" + gridID + "," + isModal + ",null)\" class=\"link_form_text link_hover_text_1\">search</a></td></tr><tr><td height=\"5\"></td></tr></table></td><td><img src=\"images/but_right.gif\"></td><td><img src=\"images/but_left.gif\"></td><td class=\"generic_button_tile\" height=\"24\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td><a href=\"javascript:void(0)\" onclick=\"toggleGridSearch(" + gridID + "," + isModal + ")\" class=\"link_form_text link_hover_text_1\">switch to standard search</a></td></tr><tr><td height=\"5\"></td></tr></table></td><td><img src=\"images/but_right.gif\"></td><td><img src=\"images/but_left.gif\"></td><td class=\"generic_button_tile\" height=\"24\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td><a href=\"javascript:void(0)\" onclick=\"clearAdvancedSearch(" + gridID + "," + isModal + ")\" class=\"link_form_text link_hover_text_1\">clear search</a></td></tr><tr><td height=\"5\"></td></tr></table></td><td><img src=\"images/but_right.gif\"></td></tr></table></td></tr></table></div><div id=\"" + advancedSearchInnerWrappingDiv + gridID.toString() + "\" class=\"advancedsearchinsidewrapper\"></div></div>";
	return "<div class=\"margin_11\"></div><div id=\"" + advancedSearchWrappingDiv + gridID.toString() + "\" class=\"content_col_1 advancedsearch\"" + displaystr + "><div class=\"advancedsearchbuttonwrapper\"><div class=\"float_left\"><a href=\"javascript:void(0)\" onclick=\"checkSearch(" + gridID + "," + isModal + ",null)\" class=\"but_1 menu_indent_1\">search</a></div><div class=\"float_left\"><a href=\"javascript:void(0)\" onclick=\"toggleGridSearch(" + gridID + "," + isModal + ")\" class=\"but_1 menu_indent_1\">standard search</a></div><div class=\"float_left\"><a href=\"javascript:void(0)\" onclick=\"clearAdvancedSearch(" + gridID + "," + isModal + ")\" class=\"but_1 menu_indent_1\">clear search</a></div><div class=\"theplug\"><!--IE FIX--></div></div><div id=\"" + advancedSearchInnerWrappingDiv + gridID.toString() + "\" class=\"advancedsearchinsidewrapper\"></div></div>";
}

/*Clear advanced search*/
function clearAdvancedSearch(gridID,isModal) {
	array_of_gridlastadvancedsearchstring[gridID] = "";
	fillAdvancedSearchRows(gridID,isModal);
}

/*Function to show the advanced search area*/
function fillAdvancedSearchRows(gridID,isModal){
	var advancedsearchinnerdiv = advancedSearchInnerWrappingDiv + gridID.toString();
	//Create start row in advanced when necessary
	if (array_of_gridadvancedsearchcount[gridID] == 0 || array_of_gridlastadvancedsearchstring[gridID] == "") {
		array_of_gridadvancedsearchcount[gridID] = 0;
		document.getElementById(advancedsearchinnerdiv).innerHTML = "";
		//The "true" is just to force if check on value to true
		addAdvancedSearchElement(advancedsearchinnerdiv,gridID,array_of_gridadvancedsearchcount[gridID],true,true,isModal);
	}
	else {
		document.getElementById(advancedsearchinnerdiv).innerHTML = "";
		array_of_gridadvancedsearchcount[gridID] = 0;
		setAdvancedSearchData(advancedsearchinnerdiv,gridID,isModal);
	}
}

function toggleGridSearch(gridID,isModal){
	var searchdiv = standardSearchWrappingDiv + gridID.toString();
	var advancedsearchdiv = advancedSearchWrappingDiv + gridID.toString();
	var advancedsearchinnerdiv = advancedSearchInnerWrappingDiv + gridID.toString();
	if ((document.getElementById(searchdiv)) && (document.getElementById(advancedsearchdiv))) {
		//Standard to Advanced switch
		if (array_of_gridsearchmodestatus[gridID] == "standard"){
			//Manage divisions
			manageDisplayWindow(searchdiv,"hide");
			manageDisplayWindow(advancedsearchdiv,"show");
			//Switch search mode
			array_of_gridsearchmodestatus[gridID] = "advanced";
			//Fill advanced search rows
			fillAdvancedSearchRows(gridID,isModal);
		}
		//Advanced to Standard switch
		else if (array_of_gridsearchmodestatus[gridID] == "advanced"){
			//Manage divisions
			manageDisplayWindow(searchdiv,"show");
			manageDisplayWindow(advancedsearchdiv,"hide");
			//Switch search mode
			array_of_gridsearchmodestatus[gridID] = "standard";
			var elementid = standardSearchInputName + gridID.toString();
			document.getElementById(elementid).value = array_of_gridlaststandardsearchstring[gridID];
			setSearchFocus(elementid);
		}
		else {
			alert("Error : An invalid search mode staus for this grid was found.");
		}
	}
	else {
		alert("Error : One of the search elements that was requested to be toggled was not found.");
	}
}

function createGridAdvancedSearchInfo(gridID,componentID,displayMode,isModal){
	var loadGridStructure = function (oXML) {
		var retvalue = oXML.responseText;
		var split = retvalue.split("^||^");
		for (var s = 0;s < split.length;s++){
			var subsplit = split[s].split("|^^|");
			if (subsplit.length == 3){
				array_of_gridadvancedsearchfielddisplaynames[gridID].push(subsplit[0]);
				array_of_gridadvancedsearchfieldnames[gridID].push(subsplit[1]);
				array_of_gridadvancedsearchfieldmodifiers[gridID].push(eval(subsplit[2].toLowerCase()));
			}
			else {
				alert("Error : Invalid advanced search field information was found.");
			}
		}
		hideLoading();
		oXML = null;
	}
	var pathchange = "";
	if (isModal) {
		pathchange = modalpathchange;
	}
	hiddenSubmit(pathchange + "bin/componentfunctionmanager.asp","action=getsearchinfo&componentid=" + componentID + "&displaymode=" + displayMode,loadGridStructure,0,null,null,false);
}

function fillFieldSelect(gridID,theSelectObject){
	var len = array_of_gridadvancedsearchfielddisplaynames[gridID].length;
	for (var t = 0; t < len;t++){
		theSelectObject[t] = new Option(array_of_gridadvancedsearchfielddisplaynames[gridID][t],array_of_gridadvancedsearchfieldnames[gridID][t]);
	}
	if (len > 0) {return 0;}
	else {return -1;}
}

function fillOpSelect(gridID,theSelectObject,selectedFieldID){
	var len = theSelectObject.options.length;
	for (var t = 0; t < len; t++){
		theSelectObject.options[t] = null;
	}
	var fieldtype = array_of_gridadvancedsearchfieldmodifiers[gridID][selectedFieldID];
	theSelectObject[0] = new Option("=","like");
	if (fieldtype != 1){
		theSelectObject[1] = new Option(">",">");
		theSelectObject[2] = new Option("<","<");
	}
}

function checkForCalendar(gridID,rowID,searchValueObject,calKeeperObject,selectedFieldID){
	var fieldid = getAdvancedSearchIDForColumnName(gridID,selectedFieldID);
	var fieldtype = array_of_gridadvancedsearchfieldmodifiers[gridID][fieldid];
	if (fieldtype == 3){
		//Set up some calendar vars
		var calenderID = gridID.toString() + rowID.toString();
		var cal_formname = "calendarform" + calenderID;
		var cal_textname = searchValueObject.id;
		var cal_divname = "calendardiv" + calenderID;
		//Manage display options
		calKeeperObject.style.display = "inline";
		calKeeperObject.innerHTML = "<span id=\"" + cal_divname + "\" style=\"display:none;position:absolute;z-index:1000;\"></span>"
		searchValueObject.readOnly = true;
		searchValueObject.className = "advancedsearchinputboxdisabled";
		searchValueObject.style.cursor = "pointer";
		if (!isDate(searchValueObject.value)) {
			searchValueObject.value = calendarmessage;
		}
		//Create onclick function
		searchValueObject.onclick = function(){
			showCalendar(cal_formname,cal_textname,document.getElementById(cal_divname),null,true,true);
		}
	}
	else {
		//Manage calendar display options
		calKeeperObject.style.display = "none";
		calKeeperObject.innerHTML = "";
		searchValueObject.readOnly = false;
		searchValueObject.className = "advancedsearchinputbox";
		searchValueObject.style.cursor = "auto";
		//Clear text on unselect
		if (searchValueObject.value == calendarmessage) {
			searchValueObject.value = "";
		}
		//Remove onclick function
		searchValueObject.onclick = function(){
			return null;
		}
	}
}

function addAdvancedSearchElement(parentdiv,gridID,currentCount,value,overrideArrayCheck,isModal){
	if (value == "--END--") {
		var limit = array_of_gridadvancedsearchcount[gridID];
		for (var i = currentCount; i < limit;i++){
			var object = document.getElementById("adSearchRow-" + gridID + "-" + i);
			object.parentNode.removeChild(object);
			array_of_gridadvancedsearchcount[gridID]--;
		}
	}
	else {
		var compareValue = array_of_gridadvancedsearchcount[gridID];
		if (overrideArrayCheck) {
			compareValue = currentCount;
		}
		if (currentCount == compareValue) {
			var nextcount = ++array_of_gridadvancedsearchcount[gridID];
			//Row
			var rowDiv = document.createElement("div");
			rowDiv.id = advancedSearchRowWrappingDiv + "-" + gridID + "-" + currentCount;
			rowDiv.className = "advancedsearchrowwarapper";
			//Field selector
			var fieldSelect = document.createElement("select");
			fieldSelect.id = advancedSearchRowFieldSelect + "-" + gridID + "-" + currentCount;
			fieldSelect.className = "common_select";
			var selectedFieldID = fillFieldSelect(gridID,fieldSelect);
			//Operation selector
			var opSelect = document.createElement("select");
			opSelect.id = advancedSearchRowOpSelect + "-" + gridID + "-" + currentCount;
			opSelect.className = "common_select";
			fillOpSelect(gridID,opSelect,selectedFieldID);
			//Search value
			var searchValue = document.createElement("input");
			searchValue.id = advancedSearchRowSearchValue + "-" + gridID + "-" + currentCount;
			searchValue.className = "common_input";
			searchValue.value = "";
			if (isie) {
				searchValue.style.marginTop = "-1px";
			}
			//Boolean selector
			var boolSelect = document.createElement("select");
			boolSelect.id = advancedSearchRowBoolSelect + "-" + gridID + "-" + currentCount;
			boolSelect.className = "common_select";
			boolSelect.onchange = function() {
				var self = this;
				addAdvancedSearchElement(parentdiv,gridID,nextcount,self.value,isModal);
				self = null;
			}
			boolSelect[0] = new Option(" - ","--END--");
			boolSelect[1] = new Option("AND","and");
			boolSelect[2] = new Option("OR","or");
			//Calendar space
			var calKeeper = document.createElement("span");
			calKeeper.id = advancedSearchCalendarSpace + "-" + gridID + "-" + currentCount;
			
			//Check if current row is calendar row
			checkForCalendar(gridID,currentCount,searchValue,calKeeper,fieldSelect.value);
			
			//The onchange field allowed operation feedback
			fieldSelect.onchange = function(){
				var self = this;
				fillOpSelect(gridID,opSelect,self.selectedIndex);
				checkForCalendar(gridID,currentCount,searchValue,calKeeper,fieldSelect.value);
				self = null;
			}
			//Auto search on enter
			searchValue.onkeydown = function(evt){
				//Handle event per browser
				if (isie) {
					checkSearch(gridID,isModal,event);
				}
				else {
					checkSearch(gridID,isModal,evt);
				}
			}
			//Add elements to row
			var elementContainer = document.createElement("span");
			elementContainer.appendChild(fieldSelect);
			elementContainer.appendChild(opSelect);
			elementContainer.appendChild(searchValue);
			elementContainer.appendChild(boolSelect);
			//Row
			rowDiv.appendChild(elementContainer);
			rowDiv.appendChild(calKeeper);
			
			//Add row to list
			document.getElementById(parentdiv).appendChild(rowDiv);
			//Set focus to element;
			setSearchFocus(searchValue.id);
		}
		else {
			//Skipped row add
		}
	}
	if (isie){
		//alert("doing content update");
		contentUpdater();
	}
}

function getAdvancedSearchData(gridID,searchfix){
	var outstr = "";
	for (var j = 0; j < array_of_gridadvancedsearchcount[gridID]; j++){
		if (j > 0){
			outstr += "^||^";
		}
		
		var field = document.getElementById(advancedSearchRowFieldSelect + "-" + gridID + "-" + j).value;
		var op = document.getElementById(advancedSearchRowOpSelect + "-" + gridID + "-" + j).value;
		var value = (document.getElementById(advancedSearchRowSearchValue + "-" + gridID + "-" + j).value).replace(searchfix," ");
		var bool = document.getElementById(advancedSearchRowBoolSelect + "-" + gridID + "-" + j).value;
		
		var fieldid = getAdvancedSearchIDForColumnName(gridID,field);
		var fieldtype = array_of_gridadvancedsearchfieldmodifiers [gridID][fieldid];
		
		outstr += fieldtype;
		outstr += "|^^|";
		outstr += field;
		outstr += "|^^|";
		outstr += op;
		outstr += "|^^|";
		if (value && value != calendarmessage) {
			outstr += value;
		}
		else {
			alert("Empty search value was found. Search aborted.");
			return false;
			
		}
		outstr += "|^^|";
		outstr += bool;
	}
	return outstr;
}

function setAdvancedSearchData(parentdiv,gridID,isModal){
	if (array_of_gridlastadvancedsearchstring[gridID]){
		var rowar = array_of_gridlastadvancedsearchstring[gridID].split(alternatesplitterregex);
		for (var k = 0; k < rowar.length; k++){
			//Do adding of rows
			if (!(document.getElementById(advancedSearchRowWrappingDiv + "-" + gridID + "-" + k))) {
				addAdvancedSearchElement(parentdiv,gridID,k,true,true,isModal);
			}
			var selectedFieldID = 0;
			var fieldar = rowar[k].split(splitterregex);
			var field = document.getElementById(advancedSearchRowFieldSelect + "-" + gridID + "-" + k);
			for (var x = 0; x < field.options.length;x++){
				if (field.options[x].value == fieldar[1]){
					field.options[x].selected = true;
					selectedFieldID = x;
					break;
				}
			}
			var op = document.getElementById(advancedSearchRowOpSelect + "-" + gridID + "-" + k);
			fillOpSelect(gridID,op,selectedFieldID);
			for (var x = 0; x < op.options.length;x++){
				if (op.options[x].value == fieldar[2]){
					op.options[x].selected = true;
					break;
				}
			}
			var searchval = document.getElementById(advancedSearchRowSearchValue + "-" + gridID + "-" + k);
			searchval.value = fieldar[3];
			var bool = document.getElementById(advancedSearchRowBoolSelect + "-" + gridID + "-" + k);
			for (var x = 0; x < bool.options.length;x++){
				if (bool.options[x].value == fieldar[4]){
					bool.options[x].selected = true;
					break;
				}
			}
			var calkeeper = document.getElementById(advancedSearchCalendarSpace + "-" + gridID + "-" + k);
			//Check if the added row is a calendar row
			checkForCalendar(gridID,k,searchval,calkeeper,field.value);
		}
	}
}

/*
A function to check if a specififed column exists in a specified grid.
Returns the column id of the first instance of the specified columnname in the grid
or -1 if a matching column is not found.
If byNameOrByField is true --> Search columnname array
If byNameOrByField is false --> Search field array
*/
function getAdvancedSearchIDForColumnName(gridID,columnName){
	var columnList;
	try {
		columnList = array_of_gridadvancedsearchfieldnames[gridID];
	}
	catch (ex) {}
	if (columnList) {
		if (columnList.length) {
			for (c = 0; c < columnList.length; c++){
				if (columnList[c].toLowerCase() == columnName.toLowerCase()) {
					return c;
				}
			}
		}
	}
	return -1;
}

/*
Function to generate filter area for the grid
*/
function createFilter(columnNames,gridName){ 
    var filter = "<div class=\"active-top-boxesoutsidewrapper\"><div class=\"active-top-boxesinsidewrapper\"><div id=\"" + gridName + "-filter\" class=\"active-top-boxes\">";
	for (var c = 0; c < columnNames.length; c++){
		filter += "<input class=\"aw-column-" + c + " common_input\" type=\"text\" id=\"" + columnNames[c] + "_filter\" name=\"" + columnNames[c] + "\" onkeydown=\"checkFilter('" + gridName + "',this,event)\">";
	}
	filter += "</div></div></div>";
    return filter; 
}

/*
Function to generate filter area for the grid
*/
function executeGridAction(gridID,relation,actionID,isModal){
	showLoading();
	//Delay to ensure that loading indeed displays.
	window.setTimeout(function(){
		var obj = array_of_grids[gridID];
		var componentID = array_of_gridcompids[gridID];
		var displayMode = array_of_griddisplaymodes[gridID];
		var completedGridExecuteAction = function(oXML) {
			var execString = oXML.responseText;
			evalstr = "executePageAction(" + execString.replace("^RelationalID^","\'" + relation + "\'") + ")";
			try {
				eval(evalstr);
			}
			catch (ex) {
				alert("Error : Execution of an action failed.\nTried :" + evalstr + "\nError:" + ex.message);
			}
			hideLoading();
			oXML = null;
		};
		checkAction(actionID,componentID,displayMode,null,true,completedGridExecuteAction,isModal);
		clearPopUpMenu();
	},0);
}

/*
Function to generate a relation string data
*/
function buildRelationData(gridID,outsideRelationList,row) {
	var obj = array_of_grids[gridID];
	var componentID = array_of_gridcompids[gridID];
	var relationString = "";
	var tempString = "";
	//Build relation string from array of relations
	for (j = 0; j < outsideRelationList.length; j++){
		if (outsideRelationList[j]){
			var colid = getIDForColumnName(gridID,outsideRelationList[j],false);
			if (colid != -1) {
				if (tempString != ""){
					tempString += "|^^|";
				}
				tempString += outsideRelationList[j] + "^||^" + obj.getCellText(colid,row);
			}
			else {
				alert("Column with name : " + outsideRelationList[j] + " not found. This may result in incomplete relationship.");
			}
		}
	}
	relationString += "sendercomponent=" + componentID;
	if (tempString != "") {
		//Remove single quotes from tempString
		relationString += "&" + tempString.replace(singlequoteregex,"\\'");
	}
	return relationString;
}


//////////////////////////////////////////////////////////////////////////////////////////////
//GRID LOADING FUNCTIONS
//////////////////////////////////////////////////////////////////////////////////////////////
/*
Function used to "CREATE" a grid (ie.locate an existing grid in a slot or create a new grid slot where necessary)
*/
function createGrid(componentID,divToLoadIn,displaymode,pagedata,gridName,loadData,isModal,useSecurity,title,subtitle) {
	//Check if grid has been created previously
	var grid_current_id = getGrid(gridName,true);

	//If grid has been not been created, set the grid_current_id to the last available slot, else the returned ID is assumed to be valid and is used.
	if (grid_current_id == -1){
		grid_current_id = grid_num;
		//Increment the global grid counter.
		grid_num++;
		//Store name only in event of new grid getting created
		array_of_gridnames[grid_current_id] = gridName;
		//Create header data structures for the new grid
		createGridDataStructure(componentID,grid_current_id,displaymode,isModal);
	}
	//Store latest grid related data in local arrays
	array_of_griddivs[grid_current_id] = divToLoadIn;
	//Titles
	array_of_gridtitles[grid_current_id] = title;
	array_of_gridsubtitles[grid_current_id] = subtitle;
	//Store search stopping flag
	array_of_searchstoppers[grid_current_id] = false;
	//Reset advanced search
	//Possibly save these value later...???
	array_of_gridlaststandardsearchstring[grid_current_id] = "";
	array_of_gridlastadvancedsearchstring[grid_current_id] = "";
	array_of_gridadvancedsearchcount[grid_current_id] = 0;
	//Advanced search dynamic field storage
	array_of_gridadvancedsearchfielddisplaynames[grid_current_id] = new Array();
	array_of_gridadvancedsearchfieldnames[grid_current_id] = new Array();
	array_of_gridadvancedsearchfieldmodifiers[grid_current_id] = new Array();
	//Default to standard search mode
	array_of_gridsearchmodestatus[grid_current_id] = "standard";
	array_of_gridlastsearchmodestatus[grid_current_id] = "standard";
	//Display mode storage
	array_of_griddisplaymodes[grid_current_id] = displaymode;
	//Add standard and gqs (relation) data to load url
	var loadURL = "",pathchange = "";
	if (isModal){
		pathchange = modalpathchange;
	}
	loadURL = pathchange + "bin/getgriddata.asp?" + pagedata;
	array_of_gridurls[grid_current_id] = loadURL;
	array_of_gridcompids[grid_current_id] = componentID;
	array_of_gridsecurityusage[grid_current_id] = useSecurity;
	//Load Advamced Search info
	createGridAdvancedSearchInfo(grid_current_id,componentID,displaymode,isModal);
	//Do a grid load with the default URL
	loadGrid(grid_current_id,loadURL,loadData,isModal,1);
}

/*
Function used to load a new grid into a specified slot
*/
function loadGrid(gridID,url,loadData,isModal,pageNum){
	/**********************************
	//Creation of objects in correct slot
	**********************************/
	//Create new instances of the grid and table object from scratch
	var obj, table;
	obj = array_of_grids[gridID] = new AW.UI.Grid/*Active.Controls.Grid*/;
	table = array_of_gridtables[gridID] = new Expert.CSV.Table/*Expert.Text.Table*/;
	
	//Get the parameters of grid stored at its creation
	var gridName = array_of_gridnames[gridID];
	var div = array_of_griddivs[gridID];
	var componentID = array_of_gridcompids[gridID];
	var displayMode = array_of_griddisplaymodes[gridID];
	var useSecurity = array_of_gridsecurityusage[gridID];
	
	//Clear filter data
	array_of_gridfilterdata[gridID] = null;
		
	/**********************************
	//Setup of grid specific attributes
	**********************************/
	//Set id of grid
	obj.setId(gridName);
		
	//Fetch column attributes and check
	var columns = array_of_columnnames[gridID];
	var fields = array_of_fieldnames[gridID];
	var order = array_of_colorders[gridID];
	if ((!(columns))||(!(fields))||(!(order))){
		alert("The requested grid's column load was unsuccessful. Grid cannot be loaded.");
		return;
	}
	
	//Set headers
	obj.setHeaderText(columns);
	
	//Set footers
	obj.setFooterVisible(false);
	/*var footers = new Array();
	for (var i = 0; i < columns.length; i++){
		footers.push("Total" + i);
	}
	obj.setFooterText(footers);
	*/
	
	//Set up grid 
	obj.setColumnIndices(order);
	//obj.setTopImage("search");
	obj.setSelectionMode("single-row");
	//obj.setVirtualMode(false);
	obj.setSelectorVisible(true);
	obj.setCellEditable(false);
	obj.setSelectorText(function(i){return this.getRowPosition(i)+1});
	obj.setSelectorWidth(32);
    
    //Disable keyboard events in grid
	//obj.setEvent("onkeydown", null);

	/*********************************
	//Custom patched refresh function
	*********************************/
	//Patched refresh function that fixes losing of positioning on refresh and hides the loading display.
	var _refresh = obj.refresh;
	obj.refresh = function(){
		_refresh.call(this);
		//Restore display.
		hideLoading();
		//Re-enable searching;
		array_of_searchstoppers[gridID] = false;
	}
	
	/**********************
	//Dynamic load of data
	**********************/
	var output = "",searchMode = array_of_gridsearchmodestatus[gridID];
	var showStandardSearch,showAdvancedSearch,searchValue = "";
	var lastSearchMode = array_of_gridlastsearchmodestatus[gridID];
	if (searchMode == "standard") {
		showStandardSearch = true;
		showAdvancedSearch = false;
	}
	else if (searchMode == "advanced"){
		showStandardSearch = false;
		showAdvancedSearch = true;
	}
	else {
		alert("Error : Invalid search mode was requested.");
	}
	if (lastSearchMode == "standard"){
		searchValue = array_of_gridlaststandardsearchstring[gridID];
	}
	else if (lastSearchMode == "advanced"){
		searchValue = array_of_gridlastadvancedsearchstring[gridID];
	}
	else {
		searchValue = "None (Invalid Search Mode)";
	}
	//Load the specified table into the grid object
	if (loadData) {
		//Double check for search breaking amp
		var ampfixer = /&+/g;
		url = url.replace(ampfixer,"&");
		var amptrim = /&+$/;
		url = url.replace(amptrim,"");
		
		//Build embedded search url
		url = url + "&searchmode=" + encodeURIComponent(lastSearchMode) + "&searchvalue=" + encodeURIComponent(searchValue) + "&currentpage=" + pageNum + "&usesecurity=" + useSecurity;
		
		//Patched response that allows post loading functions to be executed
		var defaultResponse = table.response;
		table.response = function(data){
			defaultResponse.call(table, data);
			//Show paging information
			var pageinfo = "Page " + table.getProperty("currentPage") + " of " + table.getProperty("maxPage");
			try {
				document.getElementById(gridName + "-pageinfo").innerHTML = pageinfo;
			}
			catch (ex) {}
			//Show a slow filter warning if recordCount is greater than 250 records.
			if (table.getProperty("recordCount") >= 250) {
				try {
					document.getElementById(gridName + "-display").innerHTML = filterwarning;
				}
				catch (ex) {}
			}
			
			/*obj.setBottomText(table.getProperty("recordCount"));
			obj.refresh();*/
		}
		
		//The debug bomb
		//prompt("",url);
		table.setURL(url);
		table.request();
		obj.setCellModel(table);
	
		/*************************
		//Cosmetic grid attributes
		*************************/
		
		obj.setCellTooltip(function (i,j){
			return obj.getCellData(i,j);
		});
		
		/*************************
		//Grid action setup
		*************************/
		//Check for relations in this component and save it in an array
		var outsideRelationList = getComponentRelations(componentID,isModal);
		
		obj.onRowClicked = function(event, index){
			if (event.button == 2) return;
			var relationString = buildRelationData(gridID,outsideRelationList,index);
			executeGridAction(gridID,relationString,0,isModal);
		}
		
		obj.onRowMouseUp = function(event, index){
			if (event.button != 2) return;
			var relationString = buildRelationData(gridID,outsideRelationList,index);
			var itemwidth = 0,itemcount = 0,content = "",show = true;
			var completedActionListFetch = function(oXML) {
				var returnVal = oXML.responseText;
				if (returnVal != ""){
					returnVal = returnVal.split(splitterregex);
				}
				if (returnVal.length % 2 == 0) {
					for (var h = 0; h < returnVal.length; h++){
						//<tr><td valign=\"top\"><img src=\"images/right_click_arrow.gif\"></td><td><a href=\"javascript:void(0)\" onclick=\"clearPopUpMenu()\" class=\"right_click_text right_click_hover\">cancel</a></td></tr><tr><td colspan=\"2\"><img src=\"images/right_click_line.gif\"></td></tr>
						content += "<tr><td valign=\"top\"><img src=\"images/right_click_arrow.gif\"></td><td><a href=\"javascript:void(0)\" onclick=\"executeGridAction(" + gridID + ",'" + relationString + "'," + returnVal[h++] + "," + isModal + ")\" class=\"right_click_text right_click_hover\">" + returnVal[h] + "</a></td></tr><tr><td colspan=\"2\"><img src=\"images/right_click_line.gif\"></td></tr>";
						if (returnVal[h].length > itemwidth) {
							itemwidth = returnVal[h].length;
						}
						itemcount++;
					}
					if (content == "") {
						show = false;
					}
				}
				else {
					show = false;
					alert("Error : Action list data is in an invalid format.");
				}
				hideLoading();
				oXML = null;
			};
			var pathchange = "";
			if (isModal) {
				pathchange = modalpathchange;
			}
			var data = "action=getcomponentactionlist&componentid=" + componentID + "&displaymode=" + displayMode;
			hiddenSubmit(pathchange + "bin/componentfunctionmanager.asp",data,completedActionListFetch,0,null,null,false);
			if (show){
				createPopUpMenu(content,itemwidth,itemcount,true,event);
			}
		}
		
		/*****************************
		//Edit functionality
		*****************************/
		/*
		obj.onCellEditStarted = function(text, col, row){
			alert("Edit started - text: " + text + ", col: " + col + ", row: " + row);
		}

		obj.onCellEditEnded = function(text, col, row){
			alert("Edit ended - text: " + text + ", col: " + col + ", row: " + row);
		}

		obj.onCellTextChanged = function(text, col, row){
			alert("Cell text changed - text: " + text + ", col: " + col + ", row: " + row);
		}
		*/
		obj.onCellValidating = function(text, col, row){
			if (text == "") {
				alert("Please enter a value.");
				return true;
			}
		}
		
		obj.onCellValidated = function(text, col, row){
			alert("Cell validated - text: " + text + ", col: " + col + ", row: " + row);
		}
		
		/*****************************
		//Custom add-ons
		*****************************/
		
		//Header
		var gridHeader = createHeader(gridID,isModal);
		//SubHeader
		var gridSubHeader = createSubHeader(gridID,isModal);
		//Search
		var gridSearch = createSearch(gridID,array_of_gridlaststandardsearchstring[gridID],isModal,showStandardSearch);
		//Advanced search
		var gridAdvancedSearch = createAdvancedSearch(gridID,isModal,showAdvancedSearch);
		//Filter
		var gridFilter = createFilter(columns,gridName);
		//Paging
		var gridPaging = "<div class=\"margin_6\"></div><div class=\"margin_11\"></div><div class=\"content_col_1\"><div class=\"float_right\"><a href=\"javascript:void(0)\" onclick=\"changePage(" + gridID + ",'next',null," + isModal + ",null)\" class=\"but_1\">&gt;&gt;</a></div><div class=\"float_right margin_12\"><span id=\"" + gridName + "-pageinfo\" class=\"default_text line_height_1\"><!--IEFIX--></span></div><div class=\"float_right\"><a href=\"javascript:void(0)\" onclick=\"changePage(" + gridID + ",'prev',null," + isModal + ",null)\" class=\"but_1\">&lt;&lt;</a></div><div class=\"theplug\"><!--IE FIX--></div></div><div class=\"margin_4\"></div>";
		//Information
		var gridInfo = "<div id=\"" + gridName + "-display\"></div>";
		
		/*****************************
		//Output
		*****************************/
		//Build display according to output mode
		output = gridHeader + gridSubHeader + gridSearch + gridAdvancedSearch + "<div class=\"margin_4\"></div>" + gridFilter + obj + gridPaging + gridInfo;
	}
	else {
		//This should be a grid search eventually if the non load mode is still applicable.
		output = "Load data was false. No load done.";
	}
	document.getElementById(div).innerHTML = output;
	//Post load functions
	if (searchMode == "advanced") {
		//Add first advanced search row
		fillAdvancedSearchRows(gridID,isModal);
	}
	else if (searchMode == "standard"){
		//Set focus to search box
		setSearchFocus(standardSearchInputName + gridID.toString());
	}
	else {
		alert("Error : Invalid search mode was requested.");
	}
}

function setSearchFocus(elementid){
	if (document.getElementById(elementid)){
		try {
			document.getElementById(elementid).focus();
			document.getElementById(elementid).select();
		}
		catch (ex) {
			alert ("Error occured setting focus :\n" + ex.message);
		}
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////
//SEARCHING/FILTERING/PAGING FUNCTIONS
//////////////////////////////////////////////////////////////////////////////////////////////
/*
This function is used to check when a search should be executed.
Either on click of the search button or on enter press inside the input box.
*/
function checkSearch(gridID,isModal,evt){
	var display = false;
	if (evt) {
		if (isEnterKey(evt)) {
			display = true;
		}
	}
	else {
		display = true;
	}
	if (display){
		if (isModal){
			//If there has been a filter, clear it for the grid
			if (array_of_gridfilterindices[gridID]){
				array_of_gridfilterindices[gridID] = [];
			}
			searchGrid(gridID,isModal);
		}
		else {
			showLoading();
			//If there has been a filter, clear it for the grid
			if (array_of_gridfilterindices[gridID]){
				array_of_gridfilterindices[gridID] = [];
			}
			window.setTimeout(function(){
				searchGrid(gridID,isModal);
			},0);
		}
	}
}

/*
The database driven search function
*/
function searchGrid(gridID,isModal){
	if (!(array_of_searchstoppers[gridID])) {
		//Disable multi clicked searching for this grid;
		array_of_searchstoppers[gridID] = true;
		//Define outputs
		var searchValue = "";
		//Process searchmode
		var searchMode = array_of_gridsearchmodestatus[gridID];
		var searchfix = /('|"|\||;)+/g;
		if (searchMode == "standard"){
			if (document.getElementById(standardSearchInputName + gridID.toString())) {
				searchValue = document.getElementById(standardSearchInputName + gridID.toString()).value;
				//Replace volatile characters with search string seperators
				searchValue = searchValue.replace(searchfix," ");
				array_of_gridlaststandardsearchstring[gridID] = searchValue;
				array_of_gridlastsearchmodestatus[gridID] = "standard";
			}
		}
		else if (searchMode == "advanced"){
			//A function to build a data string of all advanced search fields
			searchValue = getAdvancedSearchData(gridID,searchfix);
			if (searchValue) {
				array_of_gridlastadvancedsearchstring[gridID] = searchValue;
				array_of_gridlastsearchmodestatus[gridID] = "advanced";
			}
			else {
				hideLoading();
				array_of_searchstoppers[gridID] = false;
				return;
			}
		}
		else {
			alert("Error : Invalid search mode was requested.");
		}
		searchMode = null;
		//Load grid with needed data
		loadGrid(gridID,array_of_gridurls[gridID],true,isModal,1);
		searchValue = null;
	}
	else {
		//Search aborted, already busy.
	}
}

/*
Function to add current data to the data store for later use and reference in filtering
*/
function fetchData(gridID){
	//If no data exists force load
	var overrideLoad = false;
	if (!(array_of_gridfilterdata[gridID])) {
		overrideLoad = true;
	}
	if (overrideLoad){
		loadNewData(gridID);
	}
	return array_of_gridfilterdata[gridID];
}

function loadNewData(gridID){
	array_of_gridfilterdata[gridID] = extractData(gridID);
}

//Function to extract data from a grid object
function extractData(gridID){
	var obj = array_of_grids[gridID];
	var returnData = [];
	if (obj) {
		//var columnIndex = obj.getColumnProperty("count");
		//var rowIndex = obj.getRowProperty("count");
		var columnCount = obj.getColumnCount();
		var rowCount = obj.getRowCount();
		//Pull data displayed in grid into array
		for (var row = 0; row < rowCount; row++){ 
			var rowArray = [];
			for (var column = 0; column < columnCount; column++){ 
				//rowArray.push(obj.getDataProperty("text",row,column));
				rowArray.push(obj.getCellText(column,row));
			}
			returnData.push(rowArray);
		}
	}
	return returnData;
}

/*
This function is used to check when a search should be executed.
Either on click of the search button or on enter press inside the input box.
*/
function checkFilter(objname,source,evt){
	var filter = false;
	if (evt) {
		if (isEnterKey(evt)) {
			filter = true;
		}
	}
	if (filter){
		showLoading();
		window.setTimeout(function(){
			filterGrid(objname,source)
		},0);
	}
}

/*
The filter function
*/
function filterGrid(objname,source){
	var gid = getGrid(objname,true);
	var obj = array_of_grids[gid];
	if (obj){
		showLoading();
		var myData = fetchData(gid);
		var columnNames = array_of_columnnames[gid];
		var rowidValues = [];
		var searchvaluesaver = [];
		var res = 0;
		var remover = /\^|\||\\/g;
		var dosearch = false;
		for (var i = 0; i < columnNames.length; i++){
			//Check if any textbox is non-empty
			if (document.getElementById(columnNames[i] + "_filter").value.toLowerCase().replace(remover,"") != ""){
				dosearch = true;
			}
			//Save the search values in array
			searchvaluesaver.push(document.getElementById(columnNames[i] + "_filter").value);
		}
		//If non-empty filter
		if (dosearch){
			try {
				for (var x = 0; x < myData.length; x++){
					var addrow = true;
					//Check all columns to see if the row matches criteria
					for (var i = 0; i < columnNames.length; i++){
						//Set up search text from search value
						var searchtext = searchvaluesaver[i].toLowerCase().replace(remover,"");
						//If blank search for this column skip it
						if (!(searchtext == "")){
							//Set up regex
							var checker = new RegExp(searchtext);
							//If a single criteria is not matched, don't display row.
							if (!(myData[x][i].toLowerCase().match(checker))){
								addrow = false;
								break;
							}
						}
					}
					//Add row to display list if needed
					if (addrow) {
						rowidValues.push(x);
						res++;
					}
				}
			}
			catch (ex) {
				alert("Error was caught during a filter :\n" + ex.message);
			}
		}
		//Else show everything
		else {
			for (var x = 0; x < myData.length; x++){
				rowidValues.push(x);
				res++;
			}	
		}
		//Reset scroll
		obj.setScrollLeft(0);
		obj.setScrollTop(0);
		//Reset sorting
		obj.sort("");
		//Load the correct rows found by filter
		obj.setRowCount(res);
		obj.setRowIndices(rowidValues);
		array_of_gridfilterindices[gid] = rowidValues;
	}
}

/*
Paging function using custom extended properties in Expert.Text.Table for paging info.
*/
function changePage(gridID,direction,specificPage,isModal,evt){
	var change = true;
	if (evt) {
		if (isEnterKey(evt)) {
			//Nothing
		}
		else {
			change = false;
		}
	}
	//Fetch paging info
	var currentpage,maxpage,recordsetsize;
	var table = array_of_gridtables[gridID];
	if (table){
		currentpage = table.getProperty("currentPage");
		maxpage = table.getProperty("maxPage");
		recordsetsize = table.getProperty("rowLimit");
	}
	//Else just fail paging call.
	else {
		alert("Error : Paging information was not found in the Table object. Paging was aborted.");
		return;
	}
	//If successful; Load object and process page change.
	var obj = array_of_grids[gridID];
	if (obj && change) {
		if (!(specificPage)) {
			if (direction == "next") {
				if (currentpage < maxpage) {
					currentpage += 1;
				}
				else {
					return;
				}
			}
			else {
				if (currentpage != 1){
					currentpage -= 1;
				}
				else {
					return;
				}
			}
		}
		else {
			if (isInteger(specificPage)) {
				if ((specificPage <= maxpage) && (specificPage >= 1)) {
					currentpage = specificPage;
				}
				else {
					alert("The specified page value is out of range.");
					return;
				}
			}
			else {
				alert("A non-integer page value was supplied.");
				return;
			}
		}
		//Ensure loading is displayed
		showLoading();
		window.setTimeout(function(){
			loadGrid(gridID,array_of_gridurls[gridID],true,isModal,currentpage);
		},0);
	}
}