﻿/*
3dss.js

This file contains javascript code specific to 3DSS (see tools.js for generic code that could be used in any web app).

Since 2009 some of this code uses jQuery
*/





var xmlHttp; //AJAX object
var rolesAndStaff; 
var orgChart;
var formDirty = false; //detect if a form has been modified
var calendarClicked = false; //detected if the click was from a popupcalendar

window.onbeforeunload = ConfirmSave; //hook an event to determine if the form has been modified




// ElementToToggle: the actual object you want to show or hide
// LinkToUpdate: the link they clicked on, that needs to have it's text updated (toggled between show and hide)
// IconToUpdate: a small img to change (usually looks like: [<<] to [>>] or [+] to [-])
// ExtraWord: the word after "Show" or "Hide" in the above label, e.g.: "Menu" or "Folder"
function ShowOrHideAndUpdateLink(ElementToToggle, LinkToUpdate, IconToUpdate, ExtraWord) {

	// find the right value for css "display" of element when it's visible (when it's hidden, it's "none")
	// current version of jquery, 1.4.2, apparently has bugs in show/hide code, have to use to do this manually
	var visibleDisplayValue = "block";
	if (jQuery(ElementToToggle)[0].tagname = "td") {
		visibleDisplayValue = "table-cell";
	}
	
	// show or hide	depending on whether it's currently hidden or not
	var showNotHide = jQuery(ElementToToggle).css("display") == "none";

	// show or hide the element
	var thisAction, nextAction;
	if (showNotHide) {
		jQuery(ElementToToggle).css("display", visibleDisplayValue);
		thisAction = "Show";
		nextAction = "Hide";
		jQuery.cookie("collapse" + ExtraWord, "false");
	}
	else {
		
		jQuery(ElementToToggle).css("display", "none");
		thisAction = "Hide";
		nextAction = "Show"
		jQuery.cookie("collapse" + ExtraWord, "true");
	}
	
	// update the text you click to say "Show X" or "Hide X" as applicable (and the icon from >> to <<)
	jQuery(LinkToUpdate).html(nextAction + " " + ExtraWord);
	jQuery(IconToUpdate)[0].src = jQuery(IconToUpdate)[0].src.replace(thisAction.toLowerCase(), nextAction.toLowerCase())
	
	/* 
	This version, the original, is much simpler, as it uses jQuery.toggle() BUT it wouldn't toggle, only hide. 
	Online Research says jQuery.toggle() has bugs in some browsers. Try it again after next jQuery upgrade.

	// show or hide	
	var toggledElement = jQuery(ElementToToggle).toggle('fast');

	// work out if we're showing or hiding
	var showOrHide = "Show";
	if (toggledElement.is(":not(:hidden)")) {
	showOrHide = "Hide"
	}

	*/

}

// make certain textboxes into jQuery UI datepickers
function EnableDateChoosers() {
	jQuery(".datechooser").datepicker({
		dateFormat: 'dd/mm/yy',
		onSelect: function () { }
	});
}


// generic short message showing popup (like js "alert()")
function ShowMessage(Heading, Message) {
	jQuery("#ModalMessageLabel").text(Message);
	jQuery("#ModalMessageDiv").dialog({ title: Heading }).dialog("open");
}



// close the floating modal popup
function HideModal() {
	jQuery("#divAddNewRows").dialog('close');									//	jQuery method
}



// When a checkbox is ticked, insure that no others in the same mutually-exclusive group aren't ticked. 
// (No need to do anything when unticking)  Note: if occasion came to rewrite this, I'd put more of it server-side in RenderList() next time (like pass in the criteria as an attrib on).
function EnforceMutex(CheckBox) {
	////alert("clicked " + CheckBox.id);

	// if user just ticked this box, find others in mutex group
	if (CheckBox.checked) {

		// find the column and row of this checkbox's table cell
		// (CheckBox will have an id like "###chkBox_OHANDS Issues Checklist_0_2^^^" where "0" is the row, "2" is the column)
		var id = CheckBox.id.replace("^^^", "")
		var tokens = id.split("_");
		var numTokens = tokens.length;
		var column = tokens[numTokens - 1];
		var row = tokens[numTokens - 2];

		// use the start of the id as a group identifier for these checkboxes
		var groupId = tokens[0] + "_" + tokens[1];

		// determine if mutex grouped by columns (table) or rows
		var classId = jQuery("input[id=" + CheckBox.id + "]").parent().attr("class");
		var criteria;
		if (classId.indexOf("mutexrow") >= 0) {
			// group by rows
			criteria = "_" + row + "_";
		}
		else {
			// group by cols
			criteria = "_" + column + "^^^";
		}

		// remove any ticks from the others in this mutex group 
		// (find them using groupId, the criteria (column or row), exclude the one the user just ticked
		jQuery("input[id^=" + groupId + "][id*=" + criteria + "][id!=" + CheckBox.id + "]").attr('checked', false);
	}
}



// set page width so css can widen the main content container on pages that need to be wide 
function SetPageWidth() {
	var pw = jQuery("#PageWidth").val();
	if (pw == "wide") {
		jQuery("body").attr("class", "widePage");
	}
}


/*			3DSS Forms Manager			*/

 
//method that is invoked when a user tries to post back a page that is indicated as dirty
//this is only used when user is on a formsmanager page
function ConfirmSave()
{
	var currentURL = window.location.href.toLowerCase();
	var editSections = 'editsections.aspx';
	var index = currentURL.indexOf(editSections);

	if (calendarClicked && index > 0)
	{
		//this is a click originated from the popup calendar control, hence ignore
		formDirty = true;
		calendarClicked = false;
	}
	if (formDirty)
	{
		return "- This form may have unsaved changes. All changes will be lost if you leave this page. Do you want to continue? -";
	}
} 

//method used to display the individual section welcome pages
//PARAM
//sectionId: the id of the section to display the welcome page
function DisplayWelcomePage(sectionIdandName) {

	var split = sectionIdandName.split(",");
	var sectionId = split[0];
	var sectionName = split[1];

	//	try
	//	{
	//prevents user from navigating away if a form change is made
	if (formDirty) {
		var question = "Are you sure you want to leave this page?";
		var action = "Press OK to continue, or CANCEL to stay on the current page.";
		var result = confirm(question + "\n\nThis form may have unsaved changes. All changes will be lost if you navigate to another page. Do you want to continue?\n\n" + action);
		if (result) {
			///////GetWelcomePage(sectionId);
		}
	}
	else {
	///////////	GetWelcomePage(sectionId);
	}

	if (document.getElementById('pickerTable') != null) {
		document.getElementById('pickerTable').style.visibility = "hidden";
	}

	document.getElementById('bodyWrapRight').style.height = "10%";

	UpdateCrumbtrail(sectionName);
	document.getElementById('AttachmentsPanel').style.visibility = "hidden";

	//hide the folder column and the hide link
	var img = document.getElementById('imgHide');
	var menu = document.getElementById('colFolders');
	var textlink = document.getElementById('HideFolderText');
	if (img != null) {
		img.title = 'Show Folder...';
		img.src = 'images/rr/ico/16/showmenu16.gif';
		img.style.display = 'none';
	}
	if (textlink != null) {
		textlink.innerText = "Show Folder";
		textlink.style.display = 'none';
	}
	if (menu != null) {
		menu.style.display = 'none';
	}
	//create cookie so server can maintain state
	setCookie('collapseFolder', '1', 1);
	if (document.getElementById('folderMenu2') != null) {
		document.getElementById('folderMenu2').style.display = 'none';
	}
	if (document.getElementById('folderMenu1') != null) {
		document.getElementById('folderMenu1').style.display = '';
	}
	//	}
	//	catch(err)
	//	{
	//		alert('An error has occurred in DisplayWelcomePage(). Please report this to support: ' + err);
	//	}
}

function UpdateCrumbtrail(sectionName)
{
	//first get the page title
	if(document.getElementById('lnkSection') != null)
	{
//		document.getElementById('lnkSection').href = "";
//		document.getElementById('lnkSection').innerText = sectionName;
//		document.getElementById('lnkSection').value = sectionName;
		document.getElementById('lnkSection').outerHTML = "<span id=\"lnkSection\">" + sectionName + "</span>";
	}
	
		if(document.getElementById('lblSeparator3') != null)
	{
		document.getElementById('lblSeparator3').style.visibility = "hidden";
	}
	
		if(document.getElementById('lnkSubSection') != null)
	{
		document.getElementById('lnkSubSection').style.visibility = "hidden";
	}
	
		if(document.getElementById('lblSeparator4') != null)
	{
		document.getElementById('lblSeparator4').style.visibility = "hidden";
	}
	
		if(document.getElementById('lnkForm') != null)
	{
		document.getElementById('lnkForm').style.visibility = "hidden";
	}
}

//method use create AJAX request to get welcome page 
//PARAM
//sectionId: the id of the section to display the welcome page
function GetWelcomePage(sectionId)
{
	//show the progress image
	var img = document.getElementById('imgProgress').style.visibility = 'visible';
	
	//ajax to display section welcome page
	xmlHttp = GetXmlHttpObject();
	if (xmlHttp==null)
	{
		alert ("Browser does not support HTTP Request");
		return;
	}
	var siteId = GetQueryString('siteId');

	//pass to AJAX page to query database to get
	var url="EditSections.aspx?welcomePage=1&siteId="+siteId+"&sectionId="+sectionId;
	xmlHttp.onreadystatechange=ShowWelcomePage; 
	xmlHttp.open("GET", url, true);
	xmlHttp.send(null); 
	formDirty = false;
	calendarClicked = false;
}

//error code: 1
//method that is subscribed to the AJAX complete event of GetWelcomePage(sectionId)
function ShowWelcomePage() {
	if (xmlHttp.readyState == 4) {
		if (xmlHttp.responseText.length > 0 && xmlHttp.status == 200) {
			//hide the progress image
			document.getElementById('imgProgress').style.visibility = 'hidden';

			//hide the section panel, we cannot overwrite as it the DOM expects it to be there on postback			
			var panel = document.getElementById('pnlSectionView');
			panel.style.visibility = 'hidden';

			try {
				//document.getElementById('CompletedForms1_lstCompletedForms').style.visibility = 'hidden';
				document.getElementById('DocumentPicker1_tvDocuments').style.visibility = 'hidden';
				//document.getElementById('DocumentPicker1_lblCount').style.visibility = 'hidden';
			}
			catch (err) { }

			//response text is made up of 2 parts separated by a bar |
			// <welcome content> | <section help link>

			var response = xmlHttp.responseText.split("|");

			//display the welcome page			
			var welcome = document.getElementById('welcome');
			welcome.innerHTML = response[0];

			// hook event for help file for section 
			// cell.onclick = function() {EditRow(cell.parentNode)};
			var linkhelp = document.getElementById('lnkHelp');
			if (linkhelp != null) {
				linkhelp.onclick = function () { DisplayHelp(response[1], event); };
			}
		}
		else {
			ShowMessage("Ajax error", "An error has occurred, please try again later. If the problem persists please contact support and quote error code 1, status code" + xmlHttp.status);
		}
	}
}

//this method is used to determine on client side if the user is trying to save a form with same id
//validates on loss focus and is used be an ASP.NET custom validator
function isNameUnique(sender, args)
{
	//user entered form id
	var formId = args.Value;

	//no need to valid if overwriting an existing form
	var trimmed = trim(formId);
	if (trimmed == document.getElementById('selectedFormId').value)
	{
		//reset back to norm
		document.getElementById('btnSave').disabled = false;
		document.getElementById('lblStatus').style.display = 'none';

		//only enable SAVEAS button if this is not loading a new form definition
		if(!document.getElementById('btnNew').disabled)
		{
			document.getElementById('btnSaveAs').disabled = false;
		}
		args.isValid = true;
		return;
	} 

	//check if the same form Id already exists by looping through the completed forms listbox
	var completedForms = document.getElementById('DocumentPicker1_tvDocuments');
	var links = completedForms.getElementsByTagName("a");
	
	for (var i=0; i< completedForms.childNodes.length; i++)
	{
		var name = completedForms.childNodes[i].innerText;
		if(name == "Templates" || name == "Completed Forms"){continue;}
		
		
		formId = trim(formId);

		if (name.toLowerCase() == formId.toLowerCase())
		{
			args.isValid = false;

			//disable saving buttons
			document.getElementById('btnSave').disabled = true;
			document.getElementById('btnSaveAs').disabled = true;
			document.getElementById('btnDelete').disabled = true;
			document.getElementById('lblStatus').style.display = '';

			//setfocus to the text box and highlight all text
			var textbox = document.getElementById('documentName');			
			textbox.focus();
			textbox.select();
			return false;
		}
	 } 

	document.getElementById('btnSave').disabled = false;
	document.getElementById('lblStatus').style.display = 'none';

	//only enable SAVEAS button if this is not loading a new form definition
	if(!document.getElementById('btnNew').disabled)
	{
		document.getElementById('btnSaveAs').disabled = false;
	}
	args.isValid = true;
}


//Check, is the template name unique within company? If not, ask user to confirm
function ConfirmSaveDuplicateTemplate()
{
	 if (confirm('A template with this name already exists for this company. Do you want to overwrite this template?'))
	 {
		document.getElementById('Button2').click();
	 }
}


//delete method for marking an entry in the Organisational Chart as to be deleted on postback
//PARAM
//chkbox: the checkbox that was selected
function DeleteOrgChart(chkBox)
{
	formDirty = true;

	var chkBoxId = chkBox.id;
	var parentRow = chkBox.parentNode.parentNode;
	var cell = parentRow.cells[0];

	if (document.getElementById(chkBoxId).checked)
	{
		//update row view to indicate to be deleted
		for (var i=0; i<parentRow.cells.length; i++)
		{
			parentRow.cells[i].className = "deleteCell";
		}

	}
	else
	{
		//update row view to indicate no longer to be deleted
		for (var i=0; i<parentRow.cells.length; i++)
		{
			if (i!=2)
			{
				parentRow.cells[i].className = "orgChartCell";
			}
			else
			{
				parentRow.cells[i].className = "orgChartCellDel";
			}
		}
}
}

//delete method for marking an entry in the RolesAndResponsibility form as to be deleted on postback
//PARAM
//chkbox: the checkbox that was selected
function DeleteRolesAndResponsibilities(chkBox)
{
	var chkBoxId = chkBox.id;
	var parentRow = chkBox.parentNode.parentNode.parentNode;

	if (document.getElementById(chkBoxId).checked)
	{
		for (var i=0; i<parentRow.cells.length; i++)
		{
			var cell = parentRow.cells[i];
			cell.className = "deleteRow";
		}
	}
	else
	{
		for (var i=0; i<parentRow.cells.length; i++)
		{
			var cell = parentRow.cells[i];
			cell.className = "optionalRow";
		}
	}
}

// method use to mark that a responsibility is to be assigned to a role on postback for the RolesAndResponsibility form 
//PARAM
//chkbox: the checkbox that was selected
function AssignRole(chkBox)
{
	formDirty = true;

	//need to switch css class depending if checkbox is checked or not
	var checkbox = document.getElementById(chkBox.id);

	if (checkbox != null)
	{
		if (checkbox.checked)
		{
			checkbox.parentNode.parentNode.parentNode.className = "roleAssigned"; 
		}
		else
		{
			checkbox.parentNode.parentNode.parentNode.className = "roleUnassigned";
		}
	}
}

//mark the RolesAndResponsibility form as dirty
//PARAM:
//table: the table that contains the roleresponsbility control
function GetRolesAndResponsibilityData(table)
{
	formDirty = false;
	calendarClicked = false;
}

//mark the Organisational Chart form as dirty and saves the client side added contents in a hidden field
//to be parsed and recreated on the server side
//PARAM
//orgChart: the client Id of the orgChart table
function GetOrgChartData(orgChart)
{
	//loops through the orgchart HTML table and creates a string that respresents the table
	//all cells will be separated by | and will be parsed by the server
	//the server expects this input: format (string role|string staff|bool delete)
	//Employer|Jimmy|true|Manager|Peter|false
	formDirty = false;
	calendarClicked = false;

	var tableData;
	var table = document.getElementById(orgChart);
	var rowCount = table.rows.length - 1;
	var cellCount = table.rows[1].cells.length - 1; //subtract 1 for delete column
	var roleId = "orgChart_role";
	var staffId = "orgChart_staff";
	var separator = "|";
	var existingRowCount = table.summary;

	//only get the newly added rows through js
	for (var i= parseInt(existingRowCount) -1; i<rowCount; i++)
	{
		for (var j=0; j<cellCount+1; j++)
		{
			if (j == 0)
			{
				//role
				var chkRole = document.getElementById(roleId+i);
				if (chkRole != null)
				{
					var roleIndex = chkRole.selectedIndex;
					//alert(chkRole.options[roleIndex].text);
					tableData += chkRole.options[roleIndex].text + separator;
				}
			}
			else if (j==1)
			{
				//staff
				var chkStaff = document.getElementById(staffId+i);
				if (chkStaff != null)
				{
					var staffIndex = chkStaff.selectedIndex;
					//alert(chkStaff.options[staffIndex].text);
					tableData += chkStaff.options[staffIndex].text + separator;
				}
			}
			else if (j==2)
			{
				var row = parseInt(i) + 2;
				var chkDelete = document.getElementById('OrgChart_'+ row);
				tableData += chkDelete.checked + separator;
			}
		}
	}
	//alert(tableData);
	document.getElementById('hiddenValues').value = tableData;
}

// determine which folder is currently selected in the folder tree
// (should be functionally equivalent to getSelectedFolderId() in EditSections.aspx.cs)
function GetSelectedFolderId() {

	// try the cookie first
	var folderId = jQuery.cookie("3dss_folderId");
		
	//if not there, try the querystring
	if (!IsInteger(folderId) || parseInt(folderId) < 1) {
		folderId = jQuery.url.param("folderId"); // uses jQuery.url.js plugin

		// if not there, try the hidden field
		if (!IsInteger(folderId) || parseInt(folderId) < 1) {
			folderId = jQuery("#FolderIdHidden").val();

			// if still couldn't find it, return emptystring
			if (!IsInteger(folderId) || parseInt(folderId) < 1) {
				folderId = "";
			}
		}
	}

	return folderId;
}

// This method gets the table contents from the section list definitions and saves it in a hidden field
// to be parsed and recreated on the server side
function GetTableContents(isTemplate, documentNameRegex)
{
	// if this is a form which you can save multiple instances of, to folders, then do some checks 
	var documentName = document.getElementById('documentName');
	if (documentName != null) {

		// check document name is not missing
		if (documentName.value == '') {
			ShowMessage("Document name is missing", "Please enter a name for this document before saving.");
			return false;
		}

		// check document name does not contain invalid characters
		if (!documentNameRegex.test(documentName.value)) {
			ShowMessage("Document name is invalid", "The document name contains invalid characters. No punctuation or special characters may be used, except for a dot (.) hyphen (-) underscore (_) or space ( ). Please enter a valid name to save.");
			return false;
		}

		// check a folder was selected (unless template - they all go into one special templates folder)
		if (isTemplate == false) {
			var selectedFolderId = GetSelectedFolderId();
			if (selectedFolderId == "") {
				ShowMessage("No folder selected", "Please select a folder to save the document");
				return false;
			}
		}
	}


	
	// Loops through the section lists HTML table and creates a string that represents the table
	// table data will be separated by ::
	// table row data will be separated by ~
	// table cell data will be separated by |
	// the server expects this input: format (string tableId1~string cell1|string cell2::string tableID2~string cell1|string cell2)
	// Table_Example~table_subheading~cell1|cell2|cell3~::Table_Example2
	// Special cases, we only record string cell data therefore we ignore cells that contain images
	// We need to record the checkbox value in the cell data and append the value as 'checked=' checked.value

	// clear formdirty variable
	formDirty = false;
	calendarClicked = false;

	// get the form lists sections within this web form that has to be recorded
	// only form section lists that can modify and add new rows need to be recorded
	var hiddenField = document.getElementById('hiddenField').value;
	var tableIds = hiddenField.split("|");
	
	// store table contents in here
	var hiddenValues = document.getElementById('hiddenValues');
	hiddenValues.value = "";
			
	// loop through required sections lists table to record date
	for (var m = 0; m < tableIds.length; m++)
	{
		if (tableIds[m].length > 0)
		{
			var table = document.getElementById(tableIds[m]);
			var rowCount = table.rows.length;
			var cellSeparator = "|";
			var rowSeparator = "~";
			
			hiddenValues.value += table.id + rowSeparator;
			
			for (var i = 0; i < rowCount; i++)
			{
				var colCount = table.rows[i].cells.length;
				for (var j = 0; j < colCount; j++)
				{
					var cellContent = table.rows[i].cells[j].innerHTML;
					if (cellContent != null)
					{
						// if cell is image do nothing
						if (cellContent.indexOf('img') < 0)
						{
							// if cell is check box rendered by formsmanager
							if (cellContent.indexOf('chkBox_') > -1)
							{
								var firstIndex = cellContent.indexOf('###');
								var lastIndex = cellContent.indexOf('^^^');
								var chkId = cellContent.substring(firstIndex, lastIndex + 3);
								var checkbox = document.getElementById(chkId);
								hiddenValues.value += cellContent + 'checked=' + checkbox.checked + cellSeparator;
							}
							// if cell is check box rendered client side by JScript
							else if (cellContent.indexOf('checkbox') > -1)
							{
								var firstIndex = cellContent.indexOf('###');
								var lastIndex = cellContent.indexOf('^^^');
								var chkId = cellContent.substring(firstIndex, lastIndex + 3);
								var checkbox = document.getElementById(chkId);
								hiddenValues.value += cellContent + 'checked=' + checkbox.checked + cellSeparator;
							}
							else
							{
								hiddenValues.value += cellContent + cellSeparator;
							}
						}
					}
				}
				hiddenValues.value += rowSeparator;
			}
			hiddenValues.value += "::";
		}
	}
	//alert(hiddenValues.value);
	//hiddenValues.value = escape(hiddenValues.value);
	return true;
} 








//method used to display calendar in a floating div positioned under where user clicked
//this is used in the ADD/EDIT form list sections within the floating modal div
//PARAM
//str: the id of the field that will have the selected calendar date displayed
//event: the mouse click event
function DisplayFloatingCalendar(str, event)
{
	var agent = navigator.userAgent.toLowerCase();
	var div = document.getElementById('divCalendar'); //get the div that contains the calendar
	
	if (div.style.display == 'block')
	{
		div.style.display = 'none';
		//document.getElementById('divAddNewRows').style.height = '';
		document.getElementById('popupFrame').src = ''; //reset iframe to prevent flicker
	}
	else
	{
		var frame = document.getElementById('popupFrame');
		frame.src = 'calendarcontrolex.aspx?fieldId=' + str.id + '&container=divCalendar';
		div.style.display = 'block';
		//div.style.position = 'relative';

		if (agent.indexOf("firefox") != -1)
		{
			//calendar div position only works for Firefox		 
			div.style.left = event.layerX + 'px';
			div.style.top = event.layerY + 'px';
		}
		else if (agent.indexOf("msie") != -1) 
		{
			//this is for IE positioning of DIV
			var pos = getRelativeCoordinates(event, document.getElementById('divAddNewRows'));		 
			div.style.left = pos.x;
			div.style.top = pos.y;
		}
		else
		{
			var pos = getRelativeCoordinates(event, document.getElementById('divAddNewRows'));
			div.style.left = pos.x;
			div.style.top = pos.y;
		}
	}
}

function DeleteTheRow()
{
	// Find the correct row, and delete it
	var table = document.getElementById('tableLayout');
	var formTableId = table.getAttribute('tblId');
	var rowIndex = document.getElementById('txtRowIndex').value;
	var newRow = document.getElementById(formTableId).rows[rowIndex];
	DeleteRow(newRow);

	HideModal();
}



//method used to create a new entry in the organisation chart form
//initiates an AJAX request to create the combo boxes filled with roles and staffs
//PARAM
//table: the orgchart table
function AddOrgChartRow(table)
{
	formDirty = true;

	//AJAX call to fetch list of roles and list of staffs
	orgChart = table;
	xmlHttp = GetXmlHttpObject();
	if (xmlHttp==null)
	{
		alert ("Browser does not support HTTP Request");
		return;
	}
	var url="RolesAndStaff.aspx?sectionId="+ GetQueryString('sectionId') + '&siteId=' + GetQueryString('siteId') + "&ms=" + new Date().getTime();
	xmlHttp.onreadystatechange=RolesAndStaffComplete; 
	xmlHttp.open("GET",url,true);
	
	//change mouse cursor and show progress icon
	document.body.style.cursor = 'wait';
	var img = document.getElementById('imgProgress').style.visibility = 'visible';
	
	xmlHttp.send(null); 
}

//error code 2
//this method is called on completion of AddOrgChartRow()
//this constructs the combos of staffs and roles
function RolesAndStaffComplete()
{
	if (xmlHttp.readyState==4)
	{
		if (xmlHttp.status == 200 && xmlHttp.responseText.length > 0)
		{
			// this is the format of the responsetext that makes up the roles and staffs
			// {} separator roles from staffs
			// || separator for roles
			// :: separator for staffs
			
			rolesAndStaff = xmlHttp.responseText;
			var table = document.getElementById(orgChart);
			var rowCount = table.rows.length - 1;
			var newRow = table.insertRow(rowCount);
			newRow.className = "row";
			
			//split up the roles and staff data
			var data = rolesAndStaff.split('{}');
			var roles = data[0].split('||');
			var staffs = data[1].split('::');
			
			//add the 3 cells, roles, staff, delete
			var cellRole = newRow.insertCell(0);
			cellRole.className = "orgChartCell";
			var roleDropDown = "<SELECT class=\"formsManagerInputField\" id=\"orgChart_role" + rowCount + "\">";
			for (var i=0; i<roles.length; i++)
			{
				if (roles[i] != "")
				{
					roleDropDown += "<OPTION>" + roles[i] + "</OPTION>";
				}
			}
			roleDropDown += "</SELECT>";
			cellRole.innerHTML = roleDropDown;
			
			var cellStaff = newRow.insertCell(1);
			cellStaff.className = "orgChartCell";
			var staffDropDown = "<SELECT class=\"formsManagerInputField\" id=\"orgChart_staff" + rowCount + "\">";
			for (var j=0; j<staffs.length; j++)
			{
				if (staffs[j] != "")
				{
					staffDropDown += "<OPTION>" + staffs[j] + "</OPTION>";
				}
			}
			staffDropDown += "</SELECT>";
			cellStaff.innerHTML = staffDropDown;
			
			var cellDelete = newRow.insertCell(2);
			cellDelete.className = "orgChartCellDel";
			cellDelete.innerHTML = "<input id=\"OrgChart_" + table.rows.length + "\" type=\"checkbox\" onclick=\"DeleteOrgChart(this);\"/>";
		}
		else
		{
			alert("An error has occurred, please try again later. If the problem persists please contact support and quote error code 2, status code" + xmlHttp.status);
		}
		document.body.style.cursor = 'default';
		var img = document.getElementById('imgProgress').style.visibility = 'hidden';
	}
}


// SaveNewRow, but first try to check if there are too many characters in form answers ( > 1100 )
// for IE to handle (if IE, you have a http request limit of 2048 characters, which also needs to
// include URL, form names, etc)
function TryToSaveRow(rowAlreadyExists) {

	if (jQuery.browser.msie) {
	
		// add up length of all values of elements where id starts with "savefield"
		var totalChars = 0;
		var saveFields = jQuery("[id^='savefield']");
		for (var i = 0; i < saveFields.length; i++) {
			if (saveFields[i].value != null) {
				totalChars += saveFields[i].value.length;
			}
		}

		// if too much, alert and don't save/close
		if (totalChars > 1100) { 
			alert("Browser error: Entries too long (" + totalChars + " characters) \n\nInternet Explorer cannot open rows containing more than 1100 characters (including letters, spaces, punctuation). \n\nPlease shorten your entries, or save them elsewhere and then try again using another web browser.")
			return;
		}
	}

	// save and close modal window
	if (rowAlreadyExists) {
		UpdateRow();
	} else {
		SaveNewRow();
	}

}

//method use to update the contents user entered into the floating modal div for editing list section
//row contents
function UpdateRow() {
	formDirty = true;

	//get table where the user entered the data
	var table = document.getElementById('tableLayout');
	var rowCount = table.rows.length;

	//get table and row that will store the new data to
	var formTableId = table.getAttribute('tblId');
	var formTable = document.getElementById(formTableId);
	var formTableColCount = formTable.rows[2].cells.length;
	var rowIndex = document.getElementById('txtRowIndex').value;
	var newRow = formTable.rows[rowIndex];

	if (formTableColCount == 1) {
		formTableColCount = formTable.rows[2].cells.length;
	}

	//the add div will have 2 additional rows for spacer row, and buttons row
	//extract data from div and replace into row

	for (var i = 0; i < formTableColCount - 1; i++) {
		var fieldId = 'savefield' + i;
		var field = document.getElementById(fieldId);
		var fieldValue = '';

		if (field != null) {
			if (field.type == 'textarea') {
				fieldValue = UrlEncode(field.value);
				fieldValue = ReplaceLineBreaksWithHTMLTag(fieldValue); // + ' ';
			}
			if (field.type == 'text') {
				fieldValue = UrlEncode(field.value);
				fieldValue = ReplaceLineBreaksWithHTMLTag(fieldValue); // + ' ';
			}

			// we no longer update the checkbox contents as it overwrites the values
			if (field.type == 'select-one') {
				fieldValue = field.options[field.selectedIndex].text;
			}
			if (field.type != 'checkbox') {
				if (fieldValue.length < 1) {
					fieldValue = '&nbsp;';
				}
				newRow.cells[i].innerHTML = fieldValue;
			}
		}
	}

	HideModal();
}


// method is used to save the contents user entered into the floating modal div for create a
// new record in the section list 
function SaveNewRow()
{
	formDirty = true;
 
	//get table where the user entered the data
	var table = document.getElementById('tableLayout');
	var rowCount = table.rows.length;
	
	//get table that will store the new data to
	var formTableId = table.getAttribute('tblId');
	var formTable = document.getElementById(formTableId);
	
	// get the table header row
	var headerRow = formTable.rows[0];

	// get the best example row from the list section (table) to 
	// form the basis of creating the new table row
	var exampleRow = findAnExampleRow(formTable);
	
	// count rows/columns in table
	var formTableColCount = exampleRow.cells.length;
	var formTableRowCount = formTable.rows.length;

	//create the new row in HTML to store the data
	var newRow = formTable.insertRow(formTableRowCount);

	var thisRowHasAutoNumber = false;

	for (var i = 0; i < formTableColCount; i++) {
		var cell = newRow.insertCell(i);
		cell.className = "formsManagerTableCell";

		// if it's an autonumber column, make this cell an autonumber
		if (exampleRow.cells[i].className == "formsManagerAutoNumberTableCell") {
			cell.className = "formsManagerAutoNumberTableCell";
			thisRowHasAutoNumber = true;
		}

		//this is edit col
		if (i == formTableColCount - 1) {
			cell.onclick = function() { EditRow(cell.parentNode) };
			var imgEdit = document.createElement('img');
			imgEdit.src = 'images/rr/ico/16/newentry16.gif';
			//give hand pointer
			imgEdit.style.cursor = 'pointer';
			cell.appendChild(imgEdit);
		}
		//this is delete col
		//		else if (i == formTableColCount-1)
		//		{
		//			cell.onclick = function() {DeleteRow(cell.parentNode)};
		//			var imgDelete = document.createElement('img');
		//			
		//			//the URL link is dependant on the IIS virtual director/website alias
		//			imgDelete.src = 'images/delete.gif';
		//			//give hand pointer
		//			imgDelete.style.cursor = 'pointer';
		//			cell.appendChild(imgDelete);
		//		}
	}
	
	// the add div will have 2 additional rows for spacer row, and buttons row
		
	
	// extract data from div
	var cellPosition = 0;
	for (var i = 0; i < rowCount; i++) {	// changed rowCount - 1 to rowCount
		var fieldId = 'savefield' + i;
		var field = document.getElementById(fieldId);
		var fieldValue = '';

		if (field != null) {
			
			if (field.type == 'textarea' || field.type == 'text') {
				fieldValue = UrlEncode(field.value);
				fieldValue = ReplaceLineBreaksWithHTMLTag(fieldValue) + ' ';
			}
						

			if (field.type == 'checkbox') {
				cellPosition = cellPosition + 1;
				var id = '###' + cellPosition + formTableId + formTableRowCount + '^^^';

				if (field.checked) {
					newRow.cells[i].innerHTML = "<input type=\"checkbox\" checked=checked id=\"" + id + "\" />";
					newRow.cells[i].setAttribute('align', 'left');
				}
				else {
					newRow.cells[i].innerHTML = "<input type=\"checkbox\" id=\"" + id + "\" />";
					newRow.cells[i].setAttribute('align', 'left');
				}

			}

			if (field.type == 'select-one') {
				fieldValue = field.options[field.selectedIndex].text;
			}

			if (field.type != 'checkbox') {
				if (fieldValue.length < 1 || fieldValue == " ") {
					fieldValue = '&nbsp;';
				}

				if (newRow.cells[i] != null) {
					newRow.cells[i].innerHTML = fieldValue;

					// if autonumber, overwrite with row number
					if (i == 0 && thisRowHasAutoNumber) {
						newRow.cells[i].innerHTML = (formTableRowCount - 1).toString();
					}
				}
			}
		}
	}

	HideModal();


	// refresh the code that makes the table drag-and-drop-able (otherwise the new row isn't draggable)
	EnableDragAndDropOnTables(".listTable");
}

// given a section list, chooses the best row to use as an example row
function findAnExampleRow(formTable) {

	// get the first normal row, if there is one
	if (formTable.rows[1] != null) {
		// avoid subheader row
		if ((formTable.rows[1].cells[0].className.indexOf('SubHeader') > -1) || (formTable.rows[1].id.indexOf('listSubHeader') > -1)) {
			// first row is subheader, try next one
			if (formTable.rows[2] != null) {
				return formTable.rows[2];
			}
		}
		// row[1] exists and isn't a subheader, so use that
		return formTable.rows[1];
	}

	// no normal rows (list has headers but is emtpy), so try just using header row
	return formTable.rows[0];
}


//this method is used to delete an existing row in the section list 
//PARAM
//tableRow: the row to be deleted
function DeleteRow(tableRow)
{
	var indexHeader = tableRow.cells[0].id.indexOf('cellHeader');
	var indexSubHeader = tableRow.cells[0].id.indexOf('cellSubHeader');
	//var indexMandatory = tableRow.cells[0].id.indexOf('mandatory');
 
	if (indexHeader == -1 && indexSubHeader == -1)
	{
//		var result = confirm("Are you sure you want to delete this row?");
//		if (!result)
//		{
//			return;
//		}
		//get the owning parent table id
		var table = tableRow.parentNode.parentNode;
		var tableId = table.id;
		document.getElementById(tableId).deleteRow(tableRow.rowIndex);
		
		//set dirty flag
		formDirty = true;
	}
}


// Creates, using an AJAX call, a popup which allows user to edit a single row from a form list (e.g.: Attendees).
// Shows this popup as a modal dialog box.
function ShowFormListRowEditor(TableId, ExtraUrlParameters) {

	//change mouse cursor to loading 
	document.body.style.cursor = "wait";

	// gets info, required by the page that renders the "add/edit row" form, from the querystring and the table heading
	var url = "RenderAddNewRow.aspx" + "?tableId=" + TableId;
	url += "&sectionId=" + GetQueryString("sectionId");
	url += "&formId=" + GetQueryString("formId");
	url += "&siteId=" + GetQueryString("siteId");
	url += "&formDefinitionId=" + jQuery("#formDef").val();
	//url += "&ms=" + new Date().getTime();		// appears to not be used by RenderAddNewRow.aspx delete in 1.4.6 if OK

	// need to let renderaddnewrow.aspx know if this add is using the latest form def, or default form def
	if (jQuery('#btnNew').is(':disabled')) {
		url += "&newFormDef=true";
	}

	// add an additional Url parameters
	url += ExtraUrlParameters;

	// AJAX to retrieve the html fragment comprising the "add/edit row" form and put into div (so that div can be put into a modal dialog)
	jQuery.get(url, function (data) {

		// after data finishes loading: 
		
		//put it in popup div
		jQuery('#divAddNewRows').html(data);

		// show the "add/edit row" form div in a modal dialog
		jQuery("#divAddNewRows").dialog({
			autoOpen: false, // setting this to true doesn't actually open it after first time, so we set it to false, and explicitly open it below
			width: 720
		});
		jQuery("#divAddNewRows").dialog('open'); // explicitly open it

		// initialise anything that might not be initialised in the new popup
		EnableDateChoosers();

		// put focus on first textbox (but if it fails, do nothing - it's just for convenience, if it doesn't work on some browsers, no big deal, no need to show user error).
		setTimeout("try { jQuery('#savefield0')[0].focus(); } catch (err) {	var noop = err; }", 300);
	});
		
	// change cursor back to default
	document.body.style.cursor = "default";
}

// Called when clicking the "add" button under a form list (e.g.: "Attendees"). (replaced CreateNewTableRow() in 1.4.5d).
// TableId: string with Id of table
function AddRow(TableId) {
	ShowFormListRowEditor(TableId, "");
}


// Called when clicking the "edit" icon in a row of a form list (e.g.: "Attendees").
// tableRow: the tableRow to be edited
function EditRow(tableRow) {
	
	// quit if this row cannot be edited
	var indexHeader = tableRow.cells[0].id.indexOf('cellHeader');
	var indexSubHeader = tableRow.cells[0].id.indexOf('cellSubHeader');
	if (indexHeader != -1 || indexSubHeader != -1) {
		return;
	}

	// get the original TableId (of the list?)
	var owningTableId = tableRow.parentNode.parentNode.id;

	// which row is being edited
	var rowIndex = tableRow.rowIndex;
	
	// create a string containing the contents of all the existing values in this row's cells, separated by |
	var colCount = tableRow.cells.length - 1;
	var oldValue = '';
	for (var i = 0; i < colCount; i++) {
		//escape & as it affects the .NET request.querystring collection
		//empty cells have &nbsp;
		oldValue += escape(tableRow.cells[i].innerHTML) + '|';
	}
	

	var url = "&oldValue=" + oldValue + "&rowIndex=" + rowIndex + "&edit=true"

	ShowFormListRowEditor(owningTableId, url);




	/*
	//AJAX to retrieve the ADD form and put results into div
	xmlHttp = GetXmlHttpObject();
	if (xmlHttp == null) {
		alert("Browser does not support HTTP Request");
		return;
	}

	var formId = GetQueryString('formId');
	var siteId = GetQueryString('siteId');

	//get the table heading and the section id and pass to AJAX page to query database to get
	//oldValue = EscapeHTMLWhitespace(oldValue);
	var formDefId = document.getElementById('formDef').value;
	var url = "RenderAddNewRow.aspx" + "?tableId=" + owningTable + "&sectionId=" + sectionId + "&oldValue=" + oldValue + "&rowIndex=" + rowIndex + "&edit=true&siteId=" + siteId + "&formId=" + formId + "&formDefinitionId=" + formDefId;

	//need to let web service know if this add is using the latest form def, or default form def
	var defaultForm = document.getElementById('btnNew');

	if (defaultForm != null) {
		if (defaultForm.disabled) {
			url += "&newFormDef=true";
		}
	}

	xmlHttp.onreadystatechange = ShowAddNewRow;
	xmlHttp.open("GET", url, true); // changed to POST to fix 2048 char IE limit; didn't work.

	//change mouse cursor to loading and 
	document.body.style.cursor = 'wait';

	// show loading icon
	//var img = document.getElementById('imgProgress').style.visibility = 'visible';

	xmlHttp.send(null);


	*/

}



// DEPRECATED, DELETE AFTER 1.4.6
//method use when user clicks the ADD button for the section lists
//initiates an AJAX request to acquire the layout of the form in terms of fields and input boxes
//then renders the contents onto the floating modal div
function CreateNewTableRowDEPRECATED(tableId) {

	// gets info, required by the page that renders the "add/edit row" form, from the querystring and the table heading
	var url = "RenderAddNewRow.aspx" + "?tableId=" + tableId;
	url += "&sectionId=" + GetQueryString('sectionId');
	url += "&formId=" + GetQueryString("formId");
	url += "&siteId=" + GetQueryString("siteId");
	url += "&formDefinitionId=" + jQuery("#formDef").val();
	url += "&ms=" + new Date().getTime();

	// need to let renderaddnewrow.aspx know if this add is using the latest form def, or default form def
	if (jQuery('#btnNew').is(':disabled')) {
		url += "&newFormDef=true";
	}


	// AJAX to retrieve the html comprising the "add/edit row" form and put into div (so that div can be put into a modal dialog)
	jQuery.get(url, function (data) {
		jQuery('#divAddNewRows').html(data);
	});
		
	// show the "add/edit row" form div in a modal dialog
	jQuery("#divAddNewRows").dialog({
		autoOpen: false,	// setting this to true doesn't actually open it after first time, so we explicitly open it next line...
		width: 720
	});
	jQuery("#divAddNewRows").dialog('open'); // explicitly open it



	// put cursor in the first textbox, if we can. 
	jQuery("#savefield0").focus();
	try {
		///
	}
	catch (err) {
		// do nothing (it's just for convenience, if it doesn't work on some browsers, no big deal, no need to show user error).
		var noop = err;
	}







	

	/*

	var rowCount = document.getElementById(tableId).rows.length;
	var colCount = document.getElementById(tableId).rows[0].cells.length;
	var headerRow = document.getElementById(tableId).rows[0];
	var formId = GetQueryString('formId');
	var siteId = GetQueryString('siteId');

	//gets the section id from the URL and the table heading
	var sectionId = GetQueryString('sectionId');
	
	//AJAX to retrieve the ADD form and put results into div
	xmlHttp = GetXmlHttpObject();
	if (xmlHttp==null)
	{
	alert ("Browser does not support HTTP Request");
	return;
	}

	//get the table heading and the section id and pass to AJAX page to query database to get
	//need to fix for tables without headings, new req that all tables must have unique heading
	var formDefId = document.getElementById('formDef').value;
	var url="RenderAddNewRow.aspx"+"?tableId="+tableId+"&sectionId="+sectionId+"&formId="+formId+"&siteId="+siteId+"&formDefinitionId="+formDefId + "&ms=" + new Date().getTime();
	
	//need to let web service know if this add is using the latest form def, or default form def
	var defaultForm = document.getElementById('btnNew');
	
	if (defaultForm != null)
	{
	if (defaultForm.disabled)
	{
	url += "&newFormDef=true";
	}
	}
	
	xmlHttp.onreadystatechange=ShowAddNewRow; 
	xmlHttp.open("GET",url,true);
	
	//show loading icon and change mouse cursor
	document.body.style.cursor = 'wait';
	var img = document.getElementById('imgProgress').style.visibility = 'visible';

	xmlHttp.send(null); 
	
	*/

}

/*

//error code 3
//this method is consumed by both ADD and EDIT row as it displays the modal floating div.
function ShowAddNewRow() {

if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
if (xmlHttp.responseText.length > 0) {
var div = document.getElementById('divAddNewRows');
div.style.display = '';
div.innerHTML = xmlHttp.responseText;


jQuery("#divAddNewRows").dialog({
autoOpen: false,
width: 700
});

jQuery("#divAddNewRows").dialog('open');

EnableDateChoosers();

// default to first textbox, if we can. 
jQuery("#savefield0")[0].focus();
try {
////
}
catch (err) {
// do nothing
var noop = err;
}
}
}
}
else {
//alert("An error has occurred, please try again later. If the problem persists please contact support and quote error code 3, status code" + xmlHttp.status);
}

// change cursor back to default
document.body.style.cursor = 'default';

// hide spinning waiting icon
//var img = document.getElementById('imgProgress').style.visibility = 'hidden';
}

*/


function DisplayTaskPanel(str, obj)
{
	var div = document.getElementById(str);
	if (div.style.display == 'none')
	{
		div.style.display = '';
		//obj.value = 'Hide Add New';
	}
	else
	{
		div.style.display = 'none';
		//obj.value = 'Show Add New';
	}
}

function DisplayTaskCalendar(event, open, parent, close, textfield)
{
	var txt = document.getElementById(textfield);
	var coord = findPos(txt);

	var frame;
	var xpos = event.layerX;
	var ypos = event.layerY;
	frame = document.getElementById(open);
	if (frame.style.display == 'none')
	{
		var agent = navigator.userAgent.toLowerCase();
		
		if (agent.indexOf("firefox") != -1)
		{
			frame.style.left = coord[0] + txt.offsetWidth + 10 + 'px';
			frame.style.top = coord[1] + 'px';
			
			frame.style.display = '';
			document.getElementById(close).style.display = 'none';
		}
		//treat as IE
		else
		{
			//var pos = getRelativeCoordinates(event, document.getElementById(parent));
			frame.style.left = coord[0] + txt.offsetWidth + 10 + 'px';
			frame.style.top = coord[1] +'px';
			
			frame.style.display = '';
			document.getElementById(close).style.display = 'none';
		}
	}
	else
	{
		frame.style.display = 'none';
	}
}

function RecordMenuState()
{
	var url;
	var img = document.getElementById('imgCollapse');
	var img2 = document.getElementById('imgCollapse2');
	var menu = document.getElementById('colSectionMenu');
	var textlink = document.getElementById('ShowHideMenuTextLink');
	var textlink2 = document.getElementById('ShowHideMenuTextLink2');
	
	if ((img.title == 'Hide Menu...') || (img.alt == 'Hide Menu...'))
	{ 
		//visible
		//change icon and change title and show section menu
	    img.title = 'Show Menu...';
	    img.alt = 'Show Menu...';
		img.src = 'images/rr/ico/16/showmenu16.gif';
		textlink.innerHTML = "Show menu";
		menu.style.display = 'none';
		
		img2.title = 'Show Menu...';
		img2.src = 'images/rr/ico/16/showmenu16.gif';
		textlink2.innerHTML = "Show menu";

		//create cookie so server can maintain state
		setCookie('collapseMenu', '1', 1);
		
	}
	else
	{
		//invisible
		//change icon and change title and hide section menu
	    img.title = 'Hide Menu...';
        img.alt = 'Hide Menu...';
		img.src = 'images/rr/ico/16/hidemenu16.gif';
		textlink.innerHTML = "Hide menu";
		img2.title = 'Hide Menu...';
		img2.src = 'images/rr/ico/16/hidemenu16.gif';
		textlink2.innerHTML = "Hide menu";
		menu.style.display = '';
				
		//create cookie so server can maintain state
		setCookie('collapseMenu', '0', 1);
		
		//increase width of folders
		if (document.getElementById('divFolder') != null)
		{
			document.getElementById('divFolder').style.width = '250px';
		}
	}
}

// toggles (shows or hides) the middle column of the editsections form that contains the folder tree
function RecordFolderState()
{
	var url;
	var img = document.getElementById('imgHide');
	var menu = document.getElementById('colFolders');
	var textlink = document.getElementById('HideFolderText');
	
	if (img.title == 'Hide Folder...')
	{ 
		//visible
		//change icon and change title and show section menu
		img.title = 'Show Folder...';
		img.src = 'images/rr/ico/16/showmenu16.gif';
		textlink.innerHTML = "Show Folder";
		menu.style.display = 'none';
		
		//create cookie so server can maintain state
		setCookie('collapseFolder', '1', 1);
		
		document.getElementById('folderMenu2').style.display = 'none';
		document.getElementById('folderMenu1').style.display = '';
		
	}
	else
	{
		//invisible
		//change icon and change title and hide section menu
		img.title = 'Hide Folder...';
		img.src = 'images/rr/ico/16/hidemenu16.gif';
		textlink.innerHTML = "Hide Folder";
		menu.style.display = '';
		
		//create cookie so server can maintain state
		setCookie('collapseFolder', '0', 1);
		
		document.getElementById('folderMenu2').style.display = '';
		document.getElementById('folderMenu1').style.display = 'none';
	}
}

function ToggleSectionVisbility(img, tableId)
{
	var table = document.getElementById(tableId);
	
	if (img.title == 'Minimise')
	{
		img.title = 'Maximise';
		img.src = 'images/rr/ico/16/expand16.gif';
		img.align = 'right';
		
		//hide all table rows except row heading
		for (var i=1; i<table.rows.length; i++)
		{
			var row = table.rows[i];
			row.style.display = 'none';
		}
		
		//hide ADD button if it exists
		var btnAdd = img.getAttribute('buttonAdd');
		if (btnAdd != null && btnAdd.length > 0)
		{
			var btn = document.getElementById(btnAdd);
			btn.style.display = 'none';
		}
	}
	else
	{
		img.title = 'Minimise';
		img.src = 'images/rr/ico/16/collapse16.gif';
		
		//show all table rows except row heading
		for (var i=1; i<table.rows.length; i++)
		{
			var row = table.rows[i];
			row.style.display = '';
		}
		
		//show ADD button if it exists
		var btnAdd = img.getAttribute('buttonAdd');
		if (btnAdd != null && btnAdd.length > 0)
		{
			var btn = document.getElementById(btnAdd);
			btn.style.display = '';
		}
	}
}

// looks like this minimizes/maximises the subsections of the form
function HideFormSections(bool)
{
	var imgMin = document.getElementsByName('minimiseSection');

	if (bool == true)
	{
		//minimise all
		for (var i=0; i<imgMin.length; i++)
		{
			var img = imgMin[i];
			img.title = 'Maximise';
			img.src = 'images/rr/ico/16/expand16.gif';
			img.align = 'right';
			
			var tableName = img.getAttribute('tableName');
			var table = document.getElementById(tableName);
			
			//hide all table rows except table heading
			for (var j=1; j<table.rows.length; j++)
			{
				var row = table.rows[j];
				row.style.display = 'none'
			}
			
			//hide ADD button if it exists
			var btnAdd = img.getAttribute('buttonAdd');
			if (btnAdd != null && btnAdd.length > 0)
			{
				var btn = document.getElementById(btnAdd);
				btn.style.display = 'none';
			}
		}
	}
	else
	{
		//maximise all
		for (var i=0; i<imgMin.length; i++)
		{
			var img = imgMin[i];
			img.title = 'Minimise';
			img.src = 'images/rr/ico/16/collapse16.gif';
			
			var tableName = img.getAttribute('tableName');
			var table = document.getElementById(tableName);
			
			//hide all table rows except table heading
			for (var j=1; j<table.rows.length; j++)
			{
				var row = table.rows[j];
				row.style.display = ''
			}
			//show ADD button if it exists
			var btnAdd = img.getAttribute('buttonAdd');
			if (btnAdd != null && btnAdd.length > 0)
			{
				var btn = document.getElementById(btnAdd);
				btn.style.display = '';
			}
		}
	}
}

function ToggleVisibility(obj)
{
	if (document.getElementById(obj).style.display == 'none')
	{
		document.getElementById(obj).style.display = '';
	}
	else
	{
		document.getElementById(obj).style.display = 'none';
	}
} 




function DisplayCalendar(textBox)
{
	var text = document.getElementById(textBox);
	if (!text.disabled)
	{
		text.focus();
	}
}

function SetDirtyBool()
{
	var agent = navigator.userAgent.toLowerCase();
	if (agent.indexOf("firefox") != -1)
	{
		formDirty=true;
	}
	else
	{
		calendarClicked=true; 
	}
}

function SelectDate()
{ 
	var selectedDate = document.getElementById('TextBox1');
	var fieldId = document.getElementById('fieldId').innerHTML;
	var container = document.getElementById('container').innerHTML;
	
	var div = window.parent.document.getElementById(container);
	div.style.display = 'none';	
	window.parent.document.getElementById(fieldId).value = selectedDate.value;
	window.parent.document.getElementById('popupFrame').src = ''; //reset floating div to prevent flicker
}

var myWindow;
function DisplayHelp(str, event)
{ 
	var x = event.screenX;
	var y = event.screenY;
 
	try
	{	
		if (myWindow.closed)
		{
			openCenterWin(str, screen.width, screen.height, 0, 0);
		}
		else
		{
			myWindow.close();
		}
	}
	catch (err)
	{
		openCenterWin(str, screen.width, screen.height, 0, 0);
	}
}

function openCenterWin(url,theWidth,theHeight, xPos, yPos)
{
	var features='height='+theHeight+',width='+theWidth+',left='+xPos+',top='+yPos+',scrollbars=yes';
	myWindow=window.open(url,'',features);
}


function AddSectionSiteChange(obj, hiddenid)
{
	var id = obj.getAttribute("SectionSiteID");
	var Parent = obj.childNodes[0];
	var RadioButtonList = Parent.childNodes[0];
	
	//var Item = document.getElementById(obj);
	// alert(Item);
	//var value= Item.checked;
	//alert(value);
	
	var Item1 = obj.childNodes[0];
	var Item2 = obj.childNodes[1];
	var Item3 = obj.childNodes[2];
	alert(Item1+Item2+Item3);
	var NoAccess = Item1.childNodes[0].checked;
	var ReadOnly = Item2.childNodes[0].checked;
	var FullAccess = Item3.childNodes[0].checked;
	
	//var o2 = document.getElementById('hidden'); 
	var o2 = document.getElementById(hiddenid.id); 
	
	if(o2 == null)
	{
		//nothing
	}
	else
	{
		var oldval = o2.value;
		if(NoAccess == true)
		{
			o2.value = oldval + '/' + id + 'N';
			alert('1');
		}
		if(ReadOnly == true)
		{
			o2.value = oldval + '/' + id + 'R';
			alert('2');
		}
		if(FullAccess == true)
		{
			o2.value = oldval + '/' + id + 'F';
			alert('3');
		}
	}
	
	alert(o2.value);
}

//function ShowRelated(title) {
//	$find('modal1').show();
//	document.getElementById('title').innerHTML = title
//}






// ".listTable"
function EnableDragAndDropOnTables(tableClassName) {

	

	// Make any formsManagerTable tables drag-and-drop sortable
	jQuery(tableClassName).tableDnD({


		// keep autonumber columns auto-numbered (even when drag-and-drop sorting)
		onDrop: function (table, row) {
			formDirty = true;
			var autoNumber = 1;
			var rows = table.tBodies[0].rows;
			for (var r = 0; r < rows.length; r++) {
				for (var c = 0; c < rows[r].cells.length; c++) {
					// change all autonumber cells to the right number
					if (rows[r].cells[c].className == "formsManagerAutoNumberTableCell") {
						rows[r].cells[c].innerHTML = autoNumber;
						autoNumber++;
					}
				}
			}
		}

	});
}


// Not used yet, but planning to use it soon
function EnableDragAndDropOnOrgChart() {
	
	// Make any formsManagerTable tables drag-and-drop sortable
	jQuery(".orgChartTable").tableDnD({

		// change the row number in the name and id attributes of the role and staff select elements
		onDrop: function (table, row) {
			formDirty = true;
			var rowNumber = 1;

			var rows = table.tBodies[0].rows;
			for (var r = 0; r < rows.length; r++) {

				// cell 0 is role 
				rows[r].cells[0].childNodes[0].id = "orgChart_role" + rowNumber;
				rows[r].cells[0].childNodes[0].name = "orgChart$role" + rowNumber;

				// cell 1 is staff
				rows[r].cells[1].childNodes[0].id = "orgChart_staff" + rowNumber;
				rows[r].cells[1].childNodes[0].name = "orgChart$staff" + rowNumber;

				rowNumber++;

			}
		}

	});
}



/*
// ".listTable"
function EnableDragAndDropOnTables(tableClassName) {

	// Make any formsManagerTable tables drag-and-drop sortable
	jQuery(tableClassName).tableDnD({

		// keep autonumber columns auto-numbered (even when drag-and-drop sorting)
		onDrop: function (table, row) { AutoNumberTable(table, row); }

	});
}

// recalculate numbering of rows (update the number shown in the auto-number column)
function AutoNumberTable(Table, Row) {
	var autoNumber = 1;
	var rows = Table.tBodies[0].rows;
	for (var r = 0; r < rows.length; r++) {
		for (var c = 0; c < rows[r].cells.length; c++) {
			// change all autonumber cells to the right number
			if (rows[r].cells[c].className == "formsManagerAutoNumberTableCell") {
				rows[r].cells[c].innerHTML = autoNumber;
				autoNumber++;
			}
		}
	}
}

*/





// Global List Editor Popup

function globalListEditorPopup(siteID, globalListID) {
	var answer = confirm("Going to List Editing Page... \n\nWARNING: You will lose any unsaved changes on this page. Are you sure you want to continue?")
	if (answer) {
		var url = 'GlobalListEditor.aspx?sid=' + siteID + '&global_list_id=' + globalListID;
		//window.open('http://www.pageresource.com/jscript/jex5.htm', 'mywindow', 'width=400,height=200')
		window.open(url, 'mywindow', 'width=800,scrollbars=1')
	}
	else {
		return false;
	}
}

function closePopup() {
    //	var url = document.location.href;
    //	if (url.indexOf("GlobalListEditor.aspx") == -1) {
    //		// do nothing
    //	}

    // had to comment this out, as it also tries to close window when entering page normally (not through forms editor)!
    //    else {
    //    	alert("got here");
    //    	window.close();
    //    	if (window.opener && !window.opener.closed) {
    //    		window.opener.location.reload();
    //    	}
    //    	//parent.refresh();
    //    }

    if (window.opener != null) {
        window.opener.location.href = window.opener.location.href;

        if (window.opener.progressWindow) {
            window.opener.progressWindow.close();
        }
        window.close();
    }
}

