function postTree(TreeObj, Type, Destination, ConfirmQuery) {
	var OkSubmit = true;
	var FormName = 'frmTree';

	var itemType = TreeObj.getSelected().ItemType; 
	var itemID = TreeObj.getSelected().ItemID; 
	if (Type != itemType) {alert("This action is applicable only for a " + Type + ".\nPlease select a " + Type + " from the tree before attempting this action."); OkSubmit=false; return;}
	
	if ((ConfirmQuery != null) && (ConfirmQuery != '')) {OkSubmit = confirm(ConfirmQuery);}
	if (OkSubmit)
	{
		var BuildString = '<Form Name="' + FormName + '" Id="' + FormName + '" Action="' + Destination + '" Method="POST">';
		BuildString += "<input type=hidden id=" + itemType + "ID name=" + itemType + "ID value=" + itemID + ">";	
		BuildString += '</Form>';
	
		document.body.insertAdjacentHTML('beforeend',BuildString);
		
		// SUBMIT THE FORM
		if (document.all[FormName] != null) {document.all[FormName].submit();}	
	}
}

//functions to format a date into the required format
function FormatDateTime (formatStyle, dateToFormat) {
    //supported formatStyles
    //1 "dd MMM yyyy"
    //2 "dd/MMM/yyyy"
    //3 "dd/mm/yyyy"
    //4 "dd mmmm yyyy"
    
    var arrMonthName = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    var arrFullMonthName = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    var tempDate = new Date(dateToFormat);
    var day = tempDate.getDate();
    var month = tempDate.getMonth();
    var year = tempDate.getFullYear();
        		                            
    switch (formatStyle) {
        case 1 :
            return day + ' ' + arrMonthName[month] + ' ' + year;
            break;
            
        case 2 :
            return day + '/' + arrMonthName[month] + '/' + year;
            break;
            
        case 3 :
            return day + '/' + month + '/' + year;
            break;
            
        case 4 :
            return day + ' ' + arrFullMonthName[month] + ' ' + year;
            break;
            
        default :
            return tempDate.toLocaleDateString();
    }
}

//functions to do date arthimetic
function DateAdd(startDate, numDays, numMonths, numYears) {
	var returnDate = new Date(startDate.getTime());
	var yearsToAdd = numYears;
	
	var month = returnDate.getMonth()	+ numMonths;
	if (month > 11) {
		yearsToAdd = Math.floor((month+1)/12);
		month -= 12*yearsToAdd;
		yearsToAdd += numYears;
	}
	returnDate.setMonth(month);
	returnDate.setFullYear(returnDate.getFullYear()	+ yearsToAdd);
	
	returnDate.setTime(returnDate.getTime()+60000*60*24*numDays);
	
	return returnDate;
}

function YearAdd(startDate, numYears) {
		return DateAdd(startDate,0,0,numYears);
}

function MonthAdd(startDate, numMonths) {
		return DateAdd(startDate,0,numMonths,0);
}

function DayAdd(startDate, numDays) {
		return DateAdd(startDate,numDays,0,0);
}
    
// FUNCTION TO CHANGE AN ELEMENT'S VISIBILITY
function ChangeVisible(ElementId,KeepSpace) {
	var Element = document.all[ElementId];
	
	// TEST IF ELEMENT EXISTS
	if (Element != null) {
		// CHECK IF THE SPACE NEEDS TO BE KEPT
		if ((KeepSpace != null) && (KeepSpace)) {
			if (Element.style.visibility == 'visible')
				Element.style.visibility = 'hidden';
			else
				Element.style.visibility = 'visible';	
		} 
		
		else {
			if (Element.style.display == '')
				Element.style.display = 'none';
			else
				Element.style.display = '';
		}
	}
}

// FUNCTION TO RETURN ALL HIDDEN INPUTS ON THE FORM
function returnHiddenParams(NameIn, Delimeter) {
	NameIn += '=';
	
/*	
	rem Ryan CrawCour
	some forms now contain more than one form, so we cannot just look in the
	first form for something. now go directly to the hiddenParams box and get the value
						
	for (i=0; i < document.forms[0].elements.length;i++) {
		var e = document.forms[0].elements[i];
		if (e.name == 'hiddenParams') {
			var tempString = e.value;		
			var myArray = new Array();
			myArray = tempString.split(Delimeter);
			
			for (x=0; x<=myArray.length; x++) {
				if(myArray[x].indexOf(NameIn) >= 0) {
					tempString = myArray[x].slice(NameIn.length);
					return tempString;
				}
				
			}
		}		
	}	
*/

	var e = document.all.hiddenParams;
	var tempString = e.value;		
	var myArray = new Array();
	myArray = tempString.split(Delimeter);
	
	for (x=0; x<=myArray.length; x++) {
		if(myArray[x].indexOf(NameIn) >= 0) {
			tempString = myArray[x].slice(NameIn.length);
			return tempString;
		}		
	}
}

function returnBreadcrumbItems() {   
	for (i=0; i < document.forms[0].elements.length;i++) {
		var e = document.forms[0].elements[i];
		if (e.name == 'breadcrumbItems') {
    		return e.value;
		}		
	}    
}

// FUNCTION TO POST THE SELECTED ITEMS IN A STRING
function postThis(FormName, Destination, Method, Delimiter, ConfirmQuery, ObjName, SelectType, HiddenFieldString) {	
	var OkSubmit = true;
	var ReturnList = '';
	var HiddenList = new Array();
	var Counter;
	var TreeViewFound = -1;
	var AltArray;
	var strName;
	var strValue;
	var TreeObj = null;
	var TreeName = '';
	
	// STRUCTURE OF THE SELECTTYPE:
	// 0 = ZERO OR MANY 
	// 1 = ONE OR MANY  (DEFAULT)
	// 2 = ZERO OR ONE
	// 3 = ONE
	
	// IF NO DESTINATION SUPPLIED ALERT USER AND QUIT
	if (Destination == null) {alert('No destination was supplied. Please correct this problem and try again.'); return}
	
	// SET DEFAULT FORMNAME IF NONE WAS SUPPLIED
	if (FormName == null) {FormName = 'frmMain';}
	
	// SET THE OPTIONAL PARAMETER OF THE SELECTYPE
	if (SelectType == null) {SelectType = 1;}
	
	// SET THE DEAULT METHOD IF NONE WAS SUPPLIED
	if (Method == null) {Method = 'POST';}

	// SET THE DEAULT OBJECT NAME IF NONE WAS SUPPLIED
	if (ObjName == null) {ObjName = 'GRID';}
				
	// SET DEFAULT DELIMITER IF NONE WAS SUPPLIED
	if (Delimiter == null) {Delimiter = "|:|";}
	
	// PULL ITEMS FROM THE HIDDENFELDSTRING
	if (HiddenFieldString != null) {HiddenList = HiddenFieldString.split(Delimiter);}
						
	// CHECK IF IT IS OK 
	if (OkSubmit) {
		
		// BUILD UP THE FORM
		var BuildString = '<Form Name="' + FormName + '" Id="' + FormName + '" Action="' + Destination + '" Method="' + Method + '">'
		
		// TRY TO PULL THE INFORMATION OUT OF THE TABLE
		try {		
			// DO SELECT CHECKING
			if (  ((SelectType == 1) || (SelectType == 3))  && ((TrackPos == 0) || (TrackPos == 1)) ) {
				if (SelectType == 3)
					alert("Please select one item from the table before attempting this action");
				else
					alert("Please select at least one item from the table before attempting this action");
				return;
			}
			
			// CHECK FOR ONE OR MORE
			if ( ((SelectType == 2) || (SelectType == 3))  && (ReturnSelected().indexOf("|*|") != -1) ) {
				alert("Please select only one item before attempting this action.");
				return;
			}
			
			// CHECK FOR NONE
			if ( (SelectType == 0) && (TrackPos != 0) ) {
				alert("Please do not select any items when attempting this action.");
				return;
			}
			
	        if ((ConfirmQuery != null) && (ConfirmQuery != '')) {OkSubmit = confirm(ConfirmQuery);}

		    if (OkSubmit) {		
                ReturnList = ReturnSelected(Delimiter, ObjName);		    

			    if (ReturnList != 'false') {BuildString += '<Input Type="Hidden" Name="SelectedList" Value="' + ReturnList + '">';}
			
			    // ADD THE HIDDEN FIELDS; GO THROUGH THE HIDDENLIST ARRAY ONE BY ONE AND PULL THE HIDDEN STUFF OUT
			    for (Counter = 0; Counter < HiddenList.length; Counter++) {
				    // TRY TO PULL THE INFORMATION OUT OF THE TABLE
				    try {
					    ReturnList = returnHiddenParams(HiddenList[Counter], Delimiter);
				    }
				    catch (NoHiddenStuff) {
					    ReturnList = 'false';
				    }
    										
				    if (ReturnList != 'false') {
				        BuildString += '<Input Type="Hidden" Name="' + HiddenList[Counter] + '" Value="' + ReturnList + '">';
				        BuildString += '<Input Type="Hidden" Name="ListDelimiter" Value="' + Delimiter + '">';
                    }	
			    }
    			
		        // ADD ANOTHER HIDDEN BOX WITH THE VALUES FROM THE BREADCRUMB TRAIL HIDDEN FIELD
		        try {
		            ReturnList = returnBreadcrumbItems();
                }
                catch (NoBreadcrumbItems) {
                    ReturnList = 'false';
                }
    		    
		        if (ReturnList != 'false') {BuildString += '<Input Type="Hidden" Name="breadcrumbItems" Value="' + ReturnList + '">';}		
    		    	
        	    // FINISH THE FORM
			    BuildString += '</Form>';

			    // ADD TO THE PAGE
			    document.body.insertAdjacentHTML('beforeend',BuildString);

			    // SUBMIT THE FORM
			    if (document.all[FormName] != null) {document.all[FormName].submit();}
		    }
		}
		
		catch (NoTableSortStuff) {
			// IF WE'RE IN THIS BLOCK, IT MEANS THAT THE TREEVIEW WASN'T FOUND, AND SOMETHING WENT WRONG WITH THE RETURNLIST OR TRACKPOS PARAMETERS.
			alert("The client-side 'postThis' method has failed. Please try the action again, and if the error persists, contact support.");
			ReturnList = 'false';
		}		    
	}
}

// FUNCTION TO SELECT ALL THE ITEMS ON A SELECT PAGE
function SelectAll(SelectItemId) {
	// DECLARE THE SELECT OBJECT
	var SelObj = document.all[SelectItemId];
	
	// CHECK FOR OBJECT STUFF
	if (SelObj == null) {SelObj = SelectItemId;}
	
	// CHECK IF THE CORRECT ELEMENT HAS BEEN PASSED THROUGH 
	if ((SelObj != null) && (SelObj.tagName == 'SELECT') && (SelObj.multiple == true)) {
		// DECLARE VARIABLES
		var SelCounter;
		
		for (SelCounter = 0; SelCounter < SelObj.options.length; SelCounter++) {
			// SET THE OPTIONS TO SELECTED
			SelObj.options[SelCounter].selected = true;			
		}
	}
}

// GENERIC FUNCTION TO OPEN A WINDOW
function OpenWindow(url,name, fullscreen, height, width, resizable, toolbar, status) {
	// ASSIGN VARIABLES
	var elurl, elname, elfullscreen, elheight, elwidth, elresize, elstatus, eltool, windowHandle;

	// GET VALUES AND CONVERT FROM ONE YESNO STUFF
	elurl=url;
	elname=name;
	elfullscreen = YesNoConversion(fullscreen);
	elheight = height;
	elwidth = width;
	elresize = YesNoConversion(resizable);
	elstatus = YesNoConversion(status);
	eltool = YesNoConversion(toolbar);
	
	
	// APPLY DEFAULTS
	if 	(elfullscreen == null) {elfullscreen = "no";}
	
	if (elresize == null) {elresize = "yes";}
		
	if (elstatus == null) {elstatus = "yes";}
		
	if (eltool == null) {eltool = "yes";}
    
	// CREATE FEATURE LIST
	elfeatures=("fullscreen=" + elfullscreen + ",height=" + elheight + ",width=" + elwidth + ",resizable=" + elresize + ",toolbar=" + eltool + ",status=" + elstatus)

	// OPEN THE WINDOW
	windowHandle = window.open(elurl,elname,elfeatures,false);
	
	// RETURN THE HANDLE
	return windowHandle;
}

// PRIVATE FUNCTION TO CONVERT FROM ANY TYPE TO YES OR NO
function YesNoConversion(value) {

	//variable for value to convert
	var elvalue;

	//assign value
	elvalue = value

	//if null return null
	if(elvalue == null) 
		return(null)

	if (elvalue == true)
		return("yes")
		
	if (elvalue == false)
		return("no")

	elvalue = elvalue.toLowerCase()

	if (elvalue == "false")
		return("no")

	if (elvalue == "true")
		return("yes")

	if (elvalue == "yes")
		return("yes")	
		
	if (elvalue == "no")
		return("no")	
		
	if (elvalue == 1)
		return("yes")

	if (elvalue == 0)
		return("no")
			
	//if anything except true  or false return null ie convert to default
		else
			return(null)
}

// FUNCTION TO HIDE/SHOW A ROW ON A TABLE
function HideShowRow(TableId,RowToHide,ShowHide) {
	// GET THE TABLE OBJECT
	var TObj = document.all[TableId];
	var NofRows = 0;
	var RowObj = null;
	
	// SET DEFAULTS
	if (ShowHide == null)
		ShowHide = 0;

	// TESTING
	if ((TObj != null) && (TObj.tagName == 'TABLE')) {
		// FIND OUT HOW MANY ROWS THE TABLE HAS
		NofRows = TObj.rows.length;
		
		// CHECKING
		if ((RowToHide >= NofRows) || (RowToHide < 0)) {
			alert("The row that you are attempting to show/hide is nonexistant");
			return;
		}
		
		// GET A HANDLE ON THE ROW OBJECT
		RowObj = TObj.rows[RowToHide];
		if (RowObj == null) {
			alert("Unexpected error encountered while attempting to hide/show the row");
			return;
		}
		
		// HIDE/SHOW THE ROW
		if (ShowHide == 0)
			RowObj.style.display = 'none';
		else
			RowObj.style.display = '';
	}
}

//BUBBLES THROUGH AN ELEMENT HEIRARCHY AND TESTS FOR AN ELEMENT BEING FOUND
function TestElement(TestFor,ElementStart) {
	var CurrentElement;
	var Found=null;
	
	CurrentElement = ElementStart;
	
	// CYCLE THROUGH THE ELEMENTS TILL WE GET TO BODY
	while ((CurrentElement.tagName != 'BODY') && (Found == null)) {
		if (CurrentElement.tagName == TestFor)
			Found = CurrentElement;	
			
		// SET TO THE NEXT ELEMENT
		CurrentElement = CurrentElement.parentElement;
	}
	
	// GIVE THE ELEMENT BACK TO THE CALLING SCRIPT
	return Found;
}

// EVENT QEUE STUFF
// ------------------------------------------------------------------------------------

// ARRAY'S FOR THE EVENTS AND THEIR EXECUTION STANDARDS
var EvName = new Array();
var EvHandler = new Array();
var strEventQeue = '';

// METHOD TO ADD AN EVENT HANDLER
function AddEvent(FullEventName,EventExecuteString) {
	// CHECK IF A FUNCTION NAME HAS BEEN SENT THROUGH AND TRANSFORM INTO A FUNCTION CALL
	if (EventExecuteString.prototype != null)
		EventExecuteString = EventExecuteString.toString().slice(9,EventExecuteString.toString().indexOf(')')+1) + ';';
	
	// CHECK IF THE EVENT EXISTS ALREADY
	var Counter;
	for (Counter = 0; Counter < EvName.length; Counter++) {
		// CHECK FOR THE NAME
		if (EvName[Counter] == FullEventName) {
			// ADD THE EVENT STRING IN WITH A LINEFEED
			EvHandler[Counter][EvHandler[Counter].length] = EventExecuteString;
			
			// EXIT THE FUNCTION
			return;
		}
	}
	
	// ASSUME AT THIS POINT THAT A NEW EVENT HANDLER MUST BE LOADED
	EvHandler[EvName.length] = new Array();
	EvHandler[EvName.length][0] = EventExecuteString;
	EvName[EvName.length] = FullEventName;
}

// FUNCTION THAT WRITES ALL THE FUNCTION EXECUTE STUFF TO THE PAGE
function WriteAllEvents() {
	var Counter;
	var Counter2;
	var strWrite = '';
	var strFuncName = '';
	var loadEvent = false;

	try {
		setPreSelected();
	} 
	
	catch (NoFormFocus) { };
	
		
	// CYCLE THROUGH AND ADD EACH ONE
	for (Counter = 0; Counter < EvName.length; Counter++) {
		// LOWECASE THE METHOD NAME
		EvName[Counter] = EvName[Counter].toLowerCase();
	
		// CHECK THE NAME OF THE EVENT
		if ((EvName[Counter] == 'window.onload') || (EvName[Counter] == 'onload'))
			loadEvent = true;
		else
			loadEvent = false;
		
		// BUILD THE FUNCTION FIRST; CHECK IF THIS IS THE LOAD EVENT
		if (!loadEvent) {
			strFuncName = 'EvLoadFor' + Counter;
			strWrite = 'function ' + strFuncName + '()\n{\n';
		}
		else
			strWrite = '';

		// ADD ALL THE EXECUTE STRINGS
		for (Counter2 = 0; Counter2 < EvHandler[Counter].length; Counter2++) {
			// ADD EACH STRING TO THE STRING FOLLOWED BY A LINEBREAK
			strWrite += EvHandler[Counter][Counter2] + ';\n';
		}
		
		// CLOSE THE FUNCTION OFF
		if (!loadEvent) {strWrite += '\n}\n' + EvName[Counter] + ' = ' + strFuncName + ';\n';}
		
		// ADD TO THE OVERALL STRING
		strEventQeue += strWrite;
	}
	
	// WRITE TO THE PAGE
	document.body.insertAdjacentHTML('beforeEnd',"&nbsp;" + "<SCRIPT DEFER Language=\"Javascript\">" + strEventQeue + "</Scr" + "ipt>");
	
	// ALSO, DO THE FOCUS ON THE FIRST ELEMENT OF THE PAGE 
	if ((document.forms.length > 1) && (document.forms[1].elements.length > 1)) {
		try {
			var frmElCounter = 0;
			while ((document.forms[1].elements[frmElCounter].type == 'hidden') && (frmElCounter < document.forms[1].elements.length))
				frmElCounter++;

			if (frmElCounter < document.forms[1].elements.length)
				document.forms[1].elements[frmElCounter].focus();
		} 
		
		catch (NoFormFocus) { };
	}
}

// METHOD TO HIDE/SHOW THE LEFT TABLE THINGY
function hideLeftMenu() {
	// CHANGE THE VISIBLE STATE OF THE MENU
	ChangeVisible('LeftTable',false);

	// ASSIGN THE TEMPORARY OBJECT
	var tObj = document.all["leftCollapseImage"];

	// CHANGE THE IMAGE
	if (tObj != null) {
		// CHECK THE STATE OF THE IMAGE
		if (tObj.src.indexOf('_hide') == -1)
			tObj.src = tObj.src.replace('_show','_hide');
		else
			tObj.src = tObj.src.replace('_hide','_show');
	}
};


window.onload = WriteAllEvents;