/*
'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_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_gridfiltervalues = new Array();
var array_of_gridautofiltervalues = 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_colactions = new Array();
var array_of_coltoggles = 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;
		//alert(ret)
		var split = retvalue.split(";");
		if (split.length == 6){
			array_of_columnnames[gridID] = eval(split[0]);
			array_of_fieldnames[gridID] = eval(split[1]);
			array_of_colorders[gridID] = eval(split[2]);
			array_of_colactions[gridID] = eval(split[3]);
			array_of_coltoggles[gridID] = eval(split[4]);
		}
		else {
			//This error is caught in the grid function itself later on.
		}
		hideLoading();
		oXML = null;
	}
	var pathchange = "";
	if (isModal) {
		pathchange = modalpathchange;
	}
	hiddenSubmit(pathchange + "include/buildgrid.asp","componentid=" + componentID + "&displaymode=" + displayMode,loadGridStructure,0,null,null,false);
}

/*
Function to create a header
*/
function createGridHeader(gridID){
	var title = array_of_gridtitles[gridID];
	return "<div class=\"grid_header_container\"><div class=\"middle_content_inner_wrapper_bend_1\"><div class=\"kumon_margin_9\"><span class=\"kumon_content_header_text_normal_1\">" + title + "</span></div></div></div>";
}

/*
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 class=\"margin_11 margin_8\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td width=\"4\"></td><td><img src=\"" + pathchange + "images/left_but.gif\"></td><td background=\"" + pathchange + "images/but_tile.gif\"><span onclick=\"checkSearch(" + gridID + "," + isModal + ",null)\" class=\"link_gbutton\" style=\"cursor:pointer;\">search</span></td><td><img src=\"" + pathchange + "images/right_but.gif\"></td><td width=\"4\"></td><td><img src=\"" + pathchange + "images/left_but.gif\"></td><td background=\"" + pathchange + "images/but_tile.gif\"><span onclick=\"toggleGridSearch(" + gridID + "," + isModal + ")\" style=\"cursor:pointer;\" class=\"link_gbutton\">switch to advanced search</span></td><td><img src=\"" + pathchange + "images/right_but.gif\"></td></tr></table></div><div class=\"margin_1\"><input onkeydown=\"checkSearch(" + gridID + "," + isModal + ",event)\" id=\"" + standardSearchInputName + gridID.toString() + "\" autocomplete=\"off\" value=\"" + prevSearch + "\" class=\"common_input input_width_3\"/></div></div></div>";
	////return "<div id=\"" + standardSearchWrappingDiv + gridID.toString() + "\" class=\"grid-standard-left-margin margin_11t margin_11\"" + displaystr +"><div class=\"margin_24\"><div class=\"float_left height_1\"><a href=\"javascript:void(0)\" onclick=\"checkSearch(" + gridID + "," + isModal + ",null)\" class=\"but_1\">search</a></div><div class=\"float_left margin_60 height_1\"><a href=\"javascript:void(0)\" onclick =\"toggleGridSearch(" + gridID + "," + isModal + ")\" class=\"but_1\">switch to advanced search</a></div><div class=\"theplug\"><!--IE FIX--></div></div><div><input onkeydown=\"checkSearch(" + gridID + "," + isModal + ",event)\" id=\"" + standardSearchInputName + gridID.toString() + "\" autocomplete=\"off\" value=\"" + prevSearch + "\" class=\"common_select form_element_width_9\"/></div></div>";
	return "<div id=\"" + standardSearchWrappingDiv + gridID.toString() + "\" class=\"searchcontainer\"" + displaystr +"><div class=\"searchbuttoncontainer\"><div class=\"float_left kumon_margin_13\"><a href=\"javascript:void(0)\" onclick=\"this.blur();checkSearch(" + gridID + "," + isModal + ",null)\" class=\"grid_button\"><span>search</span></a></div><div class=\"float_left\"><a href=\"javascript:void(0)\" onclick =\"this.blur();toggleGridSearch(" + gridID + "," + isModal + ")\" class=\"grid_button\"><span>switch to advanced search</span></a></div><div class=\"theplug\"><!--IE FIX--></div></div><div class=\"searchinputcontainer\"><input onkeydown=\"checkSearch(" + gridID + "," + isModal + ",event)\" id=\"" + standardSearchInputName + gridID.toString() + "\" autocomplete=\"off\" value=\"" + prevSearch + "\" class=\"common_input_form form_element_width_3\"/></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 class=\"margin_11 margin_8\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td width=\"4\"></td><td><img src=\"" + pathchange + "images/left_but.gif\"></td><td background=\"" + pathchange + "images/but_tile.gif\"><span onclick=\"checkSearch(" + gridID + "," + isModal + ",null)\"  style=\"cursor:pointer;\" class=\"link_gbutton\">search</span></td><td><img src=\"" + pathchange + "images/right_but.gif\"></td><td width=\"4\"></td><td><img src=\"" + pathchange + "images/left_but.gif\"></td><td background=\"" + pathchange + "images/but_tile.gif\"><span onclick=\"toggleGridSearch(" + gridID + "," + isModal + ")\"  style=\"cursor:pointer;\" class=\"link_gbutton\">switch to standard search</span></td><td><img src=\"" + pathchange + "images/right_but.gif\"></td><td width=\"4\"></td><td><img src=\"" + pathchange + "images/left_but.gif\"></td><td background=\"" + pathchange + "images/but_tile.gif\"><span onclick=\"clearAdvancedSearch(" + gridID + "," + isModal + ")\" style=\"cursor:pointer;\" class=\"link_gbutton\">clear search</span></td><td><img src=\"" + pathchange + "images/right_but.gif\"></td></tr></table></div><div id=\"" + advancedSearchInnerWrappingDiv + gridID.toString() + "\" class=\"advancedsearchinsidewrapper\"></div></div>";
	return "<div id=\"" + advancedSearchWrappingDiv + gridID.toString() + "\" class=\"advancedsearchcontainer\"" + displaystr + "><div class=\"advancedsearchbuttoncontainer\"><div class=\"float_left kumon_margin_13\"><a href=\"javascript:void(0)\" onclick=\"this.blur();checkSearch(" + gridID + "," + isModal + ",null)\" class=\"grid_button\"><span>search</span></a></div><div class=\"float_left kumon_margin_13\"><a href=\"javascript:void(0)\" onclick=\"this.blur();toggleGridSearch(" + gridID + "," + isModal + ")\" class=\"grid_button\"><span>switch to standard search</span></a></div><div class=\"float_left kumon_margin_13\"><a href=\"javascript:void(0)\" onclick=\"this.blur();clearAdvancedSearch(" + gridID + "," + isModal + ")\" class=\"grid_button\"><span>clear search</span></a></div><div class=\"theplug\"><!--IE FIX--></div></div><div id=\"" + advancedSearchInnerWrappingDiv + gridID.toString() + "\" class=\"advancedsearchinnercontainer\"><!--IEFIX--></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 status 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;
		//alert(retvalue)
		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;
	}
	//alert(pathchange + "include/componentfunctionmanager.asp");
	hiddenSubmit(pathchange + "include/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 = "advancedsearchrowwrapper";
			//Field selector
			var fieldSelect = document.createElement("select");
			fieldSelect.id = advancedSearchRowFieldSelect + "-" + gridID + "-" + currentCount;
			fieldSelect.className = "form_select advancedsearchselect";
			var selectedFieldID = fillFieldSelect(gridID,fieldSelect);
			//Operation selector
			var opSelect = document.createElement("select");
			opSelect.id = advancedSearchRowOpSelect + "-" + gridID + "-" + currentCount;
			opSelect.className = "form_select advancedsearchselect";
			fillOpSelect(gridID,opSelect,selectedFieldID);
			//Search value
			var searchValue = document.createElement("input");
			searchValue.id = advancedSearchRowSearchValue + "-" + gridID + "-" + currentCount;
			searchValue.className = "form_input";
			searchValue.value = "";
			if (isie) {
				//searchValue.style.marginTop = "-1px";
			}
			else {
				searchValue.style.marginTop = "2px";
			}
			//Boolean selector
			var boolSelect = document.createElement("select");
			boolSelect.id = advancedSearchRowBoolSelect + "-" + gridID + "-" + currentCount;
			boolSelect.className = "form_select advancedsearchselect";
			boolSelect.onchange = function() {
				var self = this;
				addAdvancedSearchElement(parentdiv,gridID,nextcount,self.value,false,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 + "\" 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 {
				//alert(evalstr);
				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);
		if(!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] + "^||^" + encodeURIComponent(obj.getCellText(colid,row));
			}
			else {
				alert("Column with name : " + outsideRelationList[j] + " not found. This may result in incomplete relationship.");
			}
		}
	}
	/*
	The line below is a pending bugfix / tweak that makes the sendercomponent parameter a fully fledged parameter for the action function.
	It could cause disruption to existing action functions because it would add the componentid as the first parameter to every function.
	*/
	//relationString += "sendercomponent^||^" + componentID;
	relationString += "sendercomponent=" + componentID;
	if (tempString != "") {
		//Remove single quotes from tempString
		relationString += "&"/*|^^|*/ + tempString.replace(singlequoteregex,"\\'");
	}
	return relationString;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//GRID COLUMN VISIBILITY FUNCTIONS
//////////////////////////////////////////////////////////////////////////////////////////////
/*
Function to generate filter area for the grid
*/
/*
function createColumnToggler(gridID,columnNames,isModal){
    var pathchange = "";
	if (isModal) {
		pathchange = modalpathchange;
	}
    var toggler = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr>";
	for (var c = 0; c < columnNames.length; c++){
		//toggler += "<span><a class=\" but_1 menu_indent_1\" href=\"javascript:void(0)\" onclick=\"toggleGridColumn(" + gridID + "," + c + ")\">" + columnNames[c] + "</a></span>";
		toggler += "<td><img src=\"" + pathchange + "images/left_but.gif\"></td><td background=\"" + pathchange + "images/but_tile.gif\"><span onclick=\"toggleGridColumn(" + gridID + "," + c + ")\" style=\"cursor:pointer;\" class=\"link_gbutton\">" + columnNames[c] + "</span></td><td><img src=\"" + pathchange + "images/right_but.gif\"></td><td width=\"4\"></td>"
	}
	//<td><img src=\"" + pathchange + "images/left_but.gif\"></td><td background=\"" + pathchange + "images/but_tile.gif\"><span onclick=\"toggleGridColumn(" + gridID + "," + c + ")\"  style=\"cursor:pointer;\" class=\"link_gbutton\">" + columnNames[c] + "</span></td><td><img src=\"" + pathchange + "images/right_but.gif\"></td><td width=\"4\"></td>
	toggler += "</tr></table>";
	//alert(toggler);
    return toggler; 
}
*/

function createColumnToggler(gridID,toggleableColIds){
    var toggler = "<div class=\"grid-standard-left-margin content_container_11_wrapper_2\">";
    
	for (var c = 0; c < toggleableColIds.length; c++){
		var marginstring = "";
		if (c != 0) {marginstring = "margin_60"};
		toggler += "<span class=\"" + marginstring + " height_1\"><a class=\"but_1\" href=\"javascript:void(0)\" onclick=\"toggleGridColumn(" + gridID + "," + toggleableColIds[c] + ")\">" + array_of_columnnames[gridID][toggleableColIds[c]] + "</a></span>";
	}
	toggler += "</div>";
	//alert(toggler);
    return toggler; 
}


function getVisibleIDOfColumn(gridID,columnid){
	var currentArray = new Array();
	currentArray = array_of_colorders[gridID];
	//alert("column" + columnid + "\narray:" + currentArray);
    for (var i = 0 ; i < currentArray.length; i++){
		if (currentArray[i] == columnid) {
			foundvalue = true;
			return i;
		}
	}
	return -1;
}

/*
Toggle grid column visibility
*/
/*
function toggleGridColumn(gridID,column){
	var obj = array_of_grids[gridID];
	if (!(isNaN(column)) && column >= 0) {
		var currentArray = new Array();
		currentArray = obj.getColumnIndices();
		var foundvalue = false;
		for (var i = 0 ; i < currentArray.length; i++){
			if (currentArray[i] == column) {
				foundvalue = true;
				currentArray[i] = null;
				break;
			}
			
		}
		if (!(foundvalue)){
			currentArray.push(column);
			currentArray.sort();
		}
		currentArray = compactArray(currentArray);
		//alert("currentArray : " + currentArray);
		obj.setColumnIndices(currentArray);
		array_of_colorders[gridID] = currentArray;
	}
	else {
		alert("Please supply a valid column");
	}
}
*/
/*
Toggle grid column visibility
*/
function toggleGridColumn(gridID,column){
	var obj = array_of_grids[gridID];
	if (!(isNaN(column)) && column >= 0) {
		var currentArray = new Array();
		currentArray = obj.getColumnIndices();
		var foundvalue = false;
		for (var i = 0 ; i < currentArray.length; i++){
			if (currentArray[i] == column) {
				foundvalue = true;
				currentArray[i] = null;
				break;
			}
		}
		if (!(foundvalue)){
			currentArray.push(column);
			currentArray.sort();
		}
		currentArray = compactArray(currentArray);
		//alert("currentArray : " + currentArray);
		obj.setColumnIndices(currentArray);
		obj.setColumnCount(currentArray.length);
		array_of_colorders[gridID] = currentArray;
		//Clear filter data
		filterGridNew(gridID,"clear",null);
		clearFilterInputs(gridID);
		array_of_gridfilterdata[gridID] = null;
		resortGrid(gridID);
	}
	else {
		alert("Please supply a valid column");
	}
}


//////////////////////////////////////////////////////////////////////////////////////////////
//GRID AUTO FILTER FUNCTIONS
//////////////////////////////////////////////////////////////////////////////////////////////
function createAutoFilter(gridID){
	var autoFilter = "<div class=\"kumon_margin_2 autofiltercontainer\">";
	//Numeric button
	autoFilter += "<div class=\"float_left kumon_margin_13\"><a class=\"grid_button\" href=\"javascript:void(0)\" onclick=\"this.blur();filterGridNew(" + gridID + ",'matchany','#')\"><span>#</span></a></div>";
	var currentLetter = "A";
	var startLetterCode = parseInt(currentLetter.charCodeAt(0));
	var currentLetterCode = parseInt(currentLetter.charCodeAt(0));
	while (currentLetterCode < startLetterCode + 26){
		autoFilter += "<div class=\"float_left kumon_margin_13\"><a class=\"grid_button\" href=\"javascript:void(0)\" onclick=\"this.blur();filterGridNew(" + gridID + ",'matchany','" + currentLetter + "')\"><span>" + currentLetter + "</span></a></div>";
		currentLetter = String.fromCharCode(++currentLetterCode);
	}
	//Clear button
	autoFilter += "<div class=\"float_left kumon_margin_13\"><a class=\"grid_button\" href=\"javascript:void(0)\" onclick=\"this.blur();filterGridNew(" + gridID + ",'clear',null)\"><span>Clear</span></a></div>";
	autoFilter += "<div class=\"theplug\"><!--IE FIX--></div></div>";
	//alert(autoFilter);
    return autoFilter; 
}


//////////////////////////////////////////////////////////////////////////////////////////////
//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,preSearch,gridTitle) {
	//Check if grid has been created previously
	
	var loadURL = "",pathchange = "";

	if (isModal){
		if (gridName == 'GridStockSearch' || gridName == 'GridStockReturnSearch')
		{
			modalpathchange = "../../../";
		}
		pathchange = modalpathchange;
	}
	
	//alert(pathchange)
	
	var grid_current_id = getGrid(gridName,true);
	//alert(grid_current_id);
	//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;
		array_of_gridtitles[grid_current_id] = gridTitle;
		//Create header data structures for the new grid
		createGridDataStructure(componentID,grid_current_id,displaymode,isModal);
	}
	//alert(gridName);
	//alert(divToLoadIn);
	//Store latest grid related data in local arrays
	array_of_griddivs[grid_current_id] = divToLoadIn;
	//Store search stopping flag
	array_of_searchstoppers[grid_current_id] = false;
	//Reset advanced search
	//Possibly save these value later...???
	if (!(preSearch)) {
		preSearch = "";
	}
	array_of_gridlaststandardsearchstring[grid_current_id] = preSearch;
	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

	loadURL = pathchange + "include/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 headerFilters = true;
	
	var obj, table;
	//obj = array_of_grids[gridID] = new AW.UI.Grid/*Active.Controls.Grid*/;
	if (headerFilters){
		obj = array_of_grids[gridID] = new AW.Grid.Extended;
	}
	else {
		obj = array_of_grids[gridID] = new AW.UI.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];

	//alert(div);

	/**********************************
	//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];

	//alert(columns)
	if ((!(columns))||(!(fields))||(!(order))){
		alert("The requested grid's column load was unsuccessful. Grid cannot be loaded.");
		return;
	}
	
	//Clear filter data
	array_of_gridfilterdata[gridID] = null;
	//Clear filter text values
	array_of_gridfiltervalues[gridID] = new Array();
	for (var k = 0;k < columns.length;k++){array_of_gridfiltervalues[gridID].push("")}
	//Clear auto filter search values
	array_of_gridautofiltervalues[gridID] = new Array();
	for (var k = 0;k < columns.length;k++){array_of_gridautofiltervalues[gridID].push("")}
	
	if (headerFilters) {
		//Set multi headers
		obj.setHeaderCount(2);
		//Set header templates
		for (var l = 0; l < columns.length;l++){
			var filterInputTemplate = new AW.UI.Input;
			filterInputTemplate.onControlValidated = function(text,col,row){
				filterGridNew(gridID,"matchall",null);
			}
			obj.setHeaderTemplate(filterInputTemplate, l,1);
		}
	}
	else {
		alert("not");
	}
	//Set headers
	obj.setHeaderText(columns,0);
	
	//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);
		//CUSTOM REFRESH ADDITIONS
		//Restore display.
		hideLoading();
		//Re-enable searching;
		array_of_searchstoppers[gridID] = false;
	}
	
		//Patched onRowIndicesChanged event handler function
	obj.onRowIndicesChanged = function(indices){
		var positions = [];
		for (var i=0; i<indices.length; i++){
			positions[indices[i]] = i;
		}
		this.setRowPosition(positions);
		//this.refresh(); // breaks editing

		// default refresh method
		var refresh = AW.System.HTML.prototype.refresh;
		
		// Refresh Left Fixed,Center, and Right Fixed rows
		refresh.call(this.getRowsTemplate(0));
		refresh.call(this.getRowsTemplate(1));
		refresh.call(this.getRowsTemplate(2));
		
		// Refresh Left Fixed,Center, and Right Fixed top headers
		refresh.call(this.getHeadersTemplate(0, 0));
		refresh.call(this.getHeadersTemplate(0, 1));
		refresh.call(this.getHeadersTemplate(0, 2));
		
		// Raise appropriate events
		this.raiseEvent("adjustScrollHeight");
		this.raiseEvent("adjustScrollBars");

		//CUSTOM REFRESH ADDITIONS
		//Restore display.
		hideLoading();
		//Re-enable searching;
		array_of_searchstoppers[gridID] = false;
		// cancel default event handler
		return true;
	}; 
	
	/**********************
	//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)";
	}
	
	//Search
	var gridSearch = createSearch(gridID,array_of_gridlaststandardsearchstring[gridID],isModal,showStandardSearch);
	//Advanced search
	var gridAdvancedSearch = createAdvancedSearch(gridID,isModal,showAdvancedSearch);

	//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;
		
		//alert(url);
		//Patched response that allows post loading functions to be executed
		var defaultResponse = table.response;
		table.response = function(data){
			// added the try-catch in order to catch the exception that occurs when something else is clicked
			// when the grid was still busy loading - KDT
			try{
				defaultResponse.call(table, data);
				//Show paging information
				var pageinfo = "Page " + table.getProperty("currentPage") + " of " + table.getProperty("maxPage");
				document.getElementById(gridName + "-pageinfo").innerHTML = pageinfo;
				//Show a slow filter warning if recordCount is greater than 250 records.
				if (table.getProperty("recordCount") >= 250) {
					document.getElementById(gridName + "-display").innerHTML = filterwarning;
				}
				//Update left numbering
				obj.setSelectorText(function(i){return ((table.getProperty("currentPage")-1)*table.getProperty("rowLimit"))+(this.getRowPosition(i)+1)});
				obj.refresh();
				/*
				obj.setBottomText(table.getProperty("recordCount"));
				obj.refresh();
				*/
			}
			catch(ex){}
		}
		
		//The debug bomb
		//prompt('text',url);
		table.setURL(url);
		table.request();
		obj.setCellModel(table);
	
		/*************************
		//Cosmetic grid attributes
		*************************/
		
		obj.setCellTooltip(function(i,j){
			return obj.getCellText(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.onCellClicked = function(event, col,row){
			if (event.button == 2) return;
			//alert("col:" + col + "\nrow:" + row);
			//now check action for 
			var relationString = buildRelationData(gridID,outsideRelationList,row);
			var actionidforcolumn = array_of_colactions[gridID][col];
			//alert(actionidforcolumn);
			executeGridAction(gridID,relationString,actionidforcolumn,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=\"" + pathchange + "images/right_click_arrow.gif\"></td><td><span onclick=\"executeGridAction(" + gridID + ",'" + relationString + "'," + returnVal[h++] + "," + isModal + ")\" style=\"cursor:pointer;\" class=\"right_click_text right_click_hover\">" + returnVal[h] + "</span></td></tr><tr><td colspan=\"2\"><img src=\"" + pathchange + "images/right_click_line.gif\"></td></tr>";
						//content += "<div class=\"century_21_right_click_height\"><div class=\"float_left\"><img src=\"images/kumon_form_arrow_1.gif\"></div><div class=\"float_left\"><a href=\"javascript:void(0)\" onclick=\"executeGridAction(" + gridID + ",'" + relationString + "'," + returnVal[h++] + "," + isModal + ")\" class=\"century_21_right_click\">" + returnVal[h] + "</a></div><div class=\"theplug\"><!--IE FIX--></div></div>";
						content += "<a href=\"javascript:void(0)\" onclick=\"executeGridAction(" + gridID + ",'" + relationString + "'," + returnVal[h++] + "," + isModal + ")\" class=\"right_click_text\">" + returnVal[h] + "</a><br/>"

						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 + "include/componentfunctionmanager.asp",data,completedActionListFetch,0,null,null,false);
			if (show){
				createPopUpMenu(content,itemwidth,itemcount,isModal,true,event);
			}
		}
		
		
		/*****************************
		//Catalogue functionality
		*****************************/
		/*if (gridName == "FurnexGridCatalogue") {
			obj.setRowHeight(100);
			obj.setCellTemplate(new Expert.Templates.Image,0);
			//obj.setCellTemplate(new Expert.Templates.Image,5);
			obj.getRowTemplate().setClass("text", "wrap");
			
			//Editibility
            obj.setCellEditable(true,5);
			obj.onCellValidating = function(text,col,row)
			{
				//alert("Edit ended - text: " + text + ", col: " + col + ", row: " + row);
				if (col == 5 && isNaN(text)) {
					alert("Please enter a valid number")
					return true;
				}
			}
			obj.onCellValidated = function(text,col,row)
			{
				//alert("Edit ended - text: " + text + ", col: " + col + ", row: " + row);
				var price = obj.getCellText(6,row);
				var productid = obj.getCellText(1,row);
				//alert("function hier");
				//return;
				//alert ("add " + productid + " to basket");
				//return;
				DoBasketAddFromGrid(productid, text);
				//doBasketAdd(productid,text); // function in catalogue.js
			}
			
			
		}
		*/
		/*****************************
		//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
		*****************************/
		//Column toggler
		//var gridColumnToggler = createColumnToggler(gridID,columns,isModal);
		//var gridColumnToggler = createColumnToggler(gridID,array_of_coltoggles[gridID]);
		
		var gridColumnToggler= '';
		
		//Header
		var gridHeader = createGridHeader(gridID);
		//Filter
		//var gridFilter = createFilter(columns,gridName);
		//AutoFilter
		var gridAutoFilter = createAutoFilter(gridID);
		
		//Paging
		//var gridPaging = "<div align=\"center\" class=\"pagediv\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" height=\"24\"><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=\"changePage(" + gridID + ",'prev',null," + isModal + ",null)\" class=\"link_form_text link_hover_text_1\">&lt;&lt;</a></td></tr><tr><td height=\"5\"></td></tr></table></td><td><img src=\"images/but_right.gif\"></td><td class=\"content_4\"><div id=\"" + gridName + "-pageinfo\" class=\"pagetext\"></div></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=\"changePage(" + gridID + ",'next',null," + isModal + ",null)\" class=\"link_form_text link_hover_text_1\">&gt;&gt;</a></td></tr><tr><td height=\"5\"></td></tr></table></td><td><img src=\"images/but_right.gif\"></td></tr></table></div>";
		
		var pathchange = "";
		if (isModal) {
			pathchange = modalpathchange;
		}
		//var gridPaging = "<div class=\"content_container_11_wrapper_2 margin_17\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\"><tr><td><img src=\"" + pathchange + "images/left_but.gif\"></td><td background=\"" + pathchange + "images/but_tile.gif\"><span onclick=\"changePage(" + gridID + ",'prev',null," + isModal + ",null)\" class=\"link_gbutton\"  style=\"cursor:pointer;\">&lt;&lt;</span></td><td><img src=\"" + pathchange + "images/right_but.gif\"></td><td width=\"4\"></td><td id=\"" + gridName + "-pageinfo\" class=\"default_content_text_bold\"><!--IEFIX--></td><td width=\"4\"></td><td><img src=\"" + pathchange + "images/left_but.gif\"></td><td background=\"" + pathchange + "images/but_tile.gif\"><span onclick=\"changePage(" + gridID + ",'next',null," + isModal + ",null)\" style=\"cursor:pointer;\" class=\"link_gbutton\">&gt;&gt;</span></td><td><img src=\"" + pathchange + "images/right_but.gif\"></td></tr></table><div class=\"content_container_11_wrapper_2 margin_17\">"
		var gridPaging = "<div class=\"grid_paging_container_spacer kumon_paging_margin pagingcontainer\"><div class=\"float_right\"><div class=\"float_left kumon_margin_13\"><a href=\"javascript:void(0)\" onclick=\"this.blur();changePage(" + gridID + ",'prev',null," + isModal + ",null)\" class=\"grid_button\"><span>&lt;&lt;</span></a></div><div class=\"float_left kumon_margin_13 form_text_2\"><div id=\"" + gridName + "-pageinfo\" class=\"grid_paging_text_spacer\"><!--IE FIX--></div></div><div class=\"float_left\"><a href=\"javascript:void(0)\" onclick=\"this.blur();changePage(" + gridID + ",'next',null," + isModal + ",null)\" class=\"grid_button\"><span>&gt;&gt;</span></a></div><div class=\"theplug\"><!--IE FIX--></div></div></div>"
		////var gridPaging = "<div class=\"content_container_11_wrapper_2 margin_17\"><div class=\"float_right\"><div class=\"float_left height_1\"><a href=\"javascript:void(0)\" onclick=\"changePage(" + gridID + ",'prev',null," + isModal + ",null)\" class=\"but_1\">&lt;&lt;</a></div><div class=\"float_left height_1\"><span id=\"" + gridName + "-pageinfo\" class=\"content_text_21 margin_29\"><!--IE FIX--></span></div><div class=\"float_left height_1\"><a href=\"javascript:void(0)\" onclick=\"changePage(" + gridID + ",'next',null," + isModal + ",null)\" class=\"but_1\">&gt;&gt;</a></div><div class=\"theplug\"><!--IE FIX--></div></div><div class=\"theplug\"><!--IE FIX--></div></div>"
		
		//The old paging
		//var gridPaging = "<div class=\"margin_6 margin_8\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\"><tr><td><img src=\"" + pathchange + "images/left_but.gif\"></td><td background=\"" + pathchange + "images/but_tile.gif\"><span onclick=\"changePage(" + gridID + ",'prev',null," + isModal + ",null)\" class=\"link_gbutton\"  style=\"cursor:pointer;\">&lt;&lt;</span></td><td><img src=\"" + pathchange + "images/right_but.gif\"></td><td width=\"4\"></td><td id=\"" + gridName + "-pageinfo\" class=\"default_content_text_bold\"><!--IEFIX--></td><td width=\"4\"></td><td><img src=\"" + pathchange + "images/left_but.gif\"></td><td background=\"" + pathchange + "images/but_tile.gif\"><span onclick=\"changePage(" + gridID + ",'next',null," + isModal + ",null)\" style=\"cursor:pointer;\" class=\"link_gbutton\">&gt;&gt;</span></td><td><img src=\"" + pathchange + "images/right_but.gif\"></td></tr></table></div>"
		//Information
		var gridInfo = "<div id=\"" + gridName + "-display\"></div>";
		
		/*****************************
		//Output
		*****************************/
		//Build display according to output mode
		output = gridHeader + gridSearch + gridAdvancedSearch + gridColumnToggler /*+ gridFilter*/ + "<div class=\"kumon_margin_2\">" + obj + "</div>" + gridAutoFilter + gridPaging + gridInfo;
		
		//alert (gridSearch);
	}
	else {
		//This should be a grid search eventually if the non load mode is still applicable.
		//output = "Load data was false. No load done.";
		output = gridHeader + gridSearch + gridAdvancedSearch;
	}
	//if (!(isModal)){
		output = "<div>" + output + "</div>";
	//}
	//alert(output);
	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 on \"" + elementid + "\":\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));
				rowArray.push(obj.getCellText(array_of_colorders[gridID][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;
	}
}
*/
/********
NEW FILTER
***************************/

/*
The new filter function
filterMode	:	"matchall" use negative filtering on all filer values(look for reasons not to include the row)
				"matchany" use positive filtering on a single text value (look for reasons to include the row)
				"clear" does what it says on the box
customFilterText : text used in "matchany" mode
*/
function filterGridNew(gridID,filterMode,customFilterText){
	var obj = array_of_grids[gridID];
	if (obj){
		showLoading();
		var myData = fetchData(gridID);
		var rowidValues = [];
		var res = 0;
		var searchvalues = array_of_gridfiltervalues[gridID];
		var autosearchvalues = array_of_gridautofiltervalues[gridID];
		var clearFilterOverride = false;
		var dosearch = null;
		var initialRowAddValue = null;
		var onMatchCheckRowAddValue = null;
		var removerForRegEx = /\^|\|/g;
		var selectedColumn = getVisibleIDOfColumn(gridID,obj.getSortColumn());
		var doReSort = false;
		
		if (filterMode == "matchall"){
			dosearch = false;
			//Switch to positive searching
			initialRowAddValue = true;
			onMatchCheckRowAddValue = false;
		}
		else if (filterMode == "matchany") {
			dosearch = true;
			doReSort = true;
			//Switch to positive searching
			initialRowAddValue = false;
			onMatchCheckRowAddValue = true;
			//clearFilterInputs(gridID);
		}
		else if (filterMode == "clear"){
			clearFilterOverride = true;
		}
		else {
			alert("Invalid filter mode requsted.");
			return;
		}
		
		if (!clearFilterOverride){
			//Check/Manipulate text filter values
			for (var i = 0; i < searchvalues.length; i++){
				if (filterMode == "matchall"){
					clearAutoFilterValues(gridID);
					//Get the filter input values
					try {
						searchvalues[i] = obj.getHeaderTemplate(i,1).getControlText();
					}
					catch (ex) {
						alert(ex.message);
					}
					//Check if any flterbox is non-empty
					if (searchvalues[i] != "" || autosearchvalues[i] != ""){
						dosearch = true;
					}
				}
				if (filterMode == "matchany"){
					clearFilterValues(gridID);
					clearFilterInputs(gridID);
					if (selectedColumn == -1 || selectedColumn == i){
						if (customFilterText == "#") {
							autosearchvalues[i] = "^\\d+";
						}
						else if (customFilterText != ""){
							autosearchvalues[i] = "^" + customFilterText;
						}
						else {
							alert("Blank value for auto filter found.");
							return;
						}
					}
					else {
						autosearchvalues[i] = "^^garbage not to match^^";
					}
				}
			}
		}
		
		//If non-empty filter and not clearing
		//alert("regular : " + searchvalues);
		//alert("auto :" + autosearchvalues);
		//alert(myData);
		if (dosearch && !(clearFilterOverride)){
			try {
				for (var x = 0; x < myData.length; x++){
					var addrow = initialRowAddValue;
					//Check all columns to see if the row matches criteria
					for (var i = 0; i < myData[x].length; i++){
						//Set up search text from search value
						var searchtext = searchvalues[array_of_colorders[gridID][i]];
						//Set up auto search text from auto search value
						var autosearchtext = autosearchvalues[array_of_colorders[gridID][i]];
						//If blank search for this column skip it
						if (autosearchtext != "" || searchtext != ""){
							//Create the search text
							var inputtext = "";
							//Case 1 : No autofilter applied present
							if (filterMode == "matchall"){
								inputtext = searchtext;
							}
							//Case 2 : No manual filter applied
							else if (filterMode == "matchany"){
								inputtext = autosearchtext;
							}
							//Case 3 : Both applied - No column for autofilter selected or column selected and it is current column
							/*else if(selectedColumn == -1 || selectedColumn == i){
								inputtext = autosearchtext + "(.)*" + searchtext
							}
							//Case 4 : Both applied - Column selected for autofilter selected, but not current column.
							else if(selectedColumn != i){
								inputtext = autosearchtext + "|" + searchtext
							}*/
							//Case 5 : ??
							else {
								//Unknown state. Somethings broken.
								alert("unknown filter text state");
								break;
							}
							//alert(inputtext);
							checker = new RegExp(inputtext,"ig");
							if (myData[x][i]){
								//alert("search : " + inputtext + "\ndata : ||" + myData[x][i] + "||\nfiltermode : ||" + filterMode + "||\nmatch : ||" + myData[x][i].toLowerCase().match(checker) + "||");
								if (/*i != 0 &&*/ ((filterMode == "matchany" && myData[x][i].toLowerCase().match(checker)) || (filterMode == "matchall" && !(myData[x][i].toLowerCase().match(checker))))){
									addrow = onMatchCheckRowAddValue;
									//alert(addrow + "for col : " + i + " and row : " + x);
									break;
								}
							}
						}
						else {
							//alert("blank filter values found in col :" + i);
						}
					}
					//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 (clear filter)
		else {
			//alert("clearing");
			//Add all rows
			for (var x = 0; x < myData.length; x++){
				rowidValues.push(x);
				res++;
			}
			//Clear all filter inputs
			clearFilterInputs(gridID);
			//Clear all filter text values
			clearFilterValues(gridID);
			//if (clearFilterOverride) {
				//Clear all auto filter text values
				clearAutoFilterValues(gridID);
				//alert("Clearing auto filter");
			//}
		}
		//Reset scroll
		obj.setScrollLeft(0);
		obj.setScrollTop(0);
		//Reset sorting
		if (!(doReSort)){
			obj.clearSortModel();
		}//Load the correct rows found by filter
		//obj.clearRowModel();
		obj.setRowCount(res);
		obj.setRowIndices(rowidValues);		
		array_of_gridfilterindices[gridID] = rowidValues;
		//Restore sorting
		if (doReSort){
			resortGrid(gridID);
		}
	}
}

function resortGrid(gridID){
	var obj = array_of_grids[gridID];
	var sortColumn = obj.getSortColumn();
	if(sortColumn != -1){
		//alert("resorting")
		obj.sort(sortColumn,obj.getSortDirection(sortColumn));
	}
}

function clearFilterInputs(gridID){
	var obj = array_of_grids[gridID];
	//Clear filter text values
	for (var l = 0; l < array_of_gridfiltervalues[gridID].length;l++){
		try {
			obj.getHeaderTemplate(l,1).setControlText("");
		}
		catch (ex) {
			alert(ex.message);
		}
	}
}

function clearFilterValues(gridID){
	//Clear filter text values
	var length = array_of_gridfiltervalues[gridID].length;
	array_of_gridfiltervalues[gridID] = new Array();
	for (var k = 0;k < length;k++){array_of_gridfiltervalues[gridID].push("")}
}

function clearAutoFilterValues(gridID){
	//Clear filter text values
	var length = array_of_gridautofiltervalues[gridID].length;
	array_of_gridautofiltervalues[gridID] = new Array();
	for (var k = 0;k < length;k++){array_of_gridautofiltervalues[gridID].push("")}
}
/*
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);
	}
}