

// ****************************************************
// ******************  GLOBAL VARS  *******************
// ****************************************************

var sRegistryUsername, bAutoLogon, bRegistryValues = 0;

// Preload stylesheet images
var aImgs = new Array;

function PreloadStylesheetImages()
{
	var imgs = new Array(
	
	'HourGlass.gif',
	'bglogo.gif',
	'bgViewLinkActive.gif',
	'bgUserButton.gif',
	'bgUserButton_on.gif',
	
	'iAct.gif', 
	'iActCALL.gif',
	'iActUNAV.gif',
	'iActUNKN.gif',
	'iActUI.gif',
	'iCheck.gif',
	'iCLAnswer.gif',
	'iConstruction.gif',
	'iContact.gif',
	'iCopy.gif',
	'iCSUnAvail.gif',
	'iClose.gif',
	'iEdit.gif',
	'iEmail.gif',
	'iExpPlus.gif',
	'iExpMinus.gif',
	'iFCArrowUp.gif',
	'iFCArrowDn.gif',
	'iFolder.gif',
	'iGroup.gif',
	'iGreeting.gif',
	'iHold.gif',
	'iKeyset.gif',
	'iKeysetCALL.gif',
	'iKeysetDND.gif',
	'iKeysetSM.gif',
	'iKeysetUNKN.gif',
	'iMessage.gif',
	'iPassport.gif',
	'iPhone.gif',
	'icon_contactPerson.gif',
	'iPlayGreeting.gif',
	'iRule.gif',
	'iRuleOn.gif',
	'iRuleOff.gif',
	'iSetPass.gif',
	'iSystemMessage.gif',
	'iTrash.gif',
	'iTransfer.gif',
	'iView.gif',
	'iVoicemail.gif',
	
	'iConf0.gif',
	'iCLCallOn.gif',
	'iErr.gif',
	'iHold.gif',
	'iHolding.gif',
	'iHoldingRecall.gif',
	'iHeld.gif',
	'iHeldRecall.gif',
	'iMute.gif',
	'iCLOrig.gif',
	'iAlertIn.gif',
	'iAlertOut.gif'
	), i=0;
	
	while (imgs[i])
		addImage('img/'+imgs[i++]);

	var oStyles = document.styleSheets("GlobalStyles").rules, i=0;
	var re = new RegExp('[url(]*([a-zA-Z0-9/\.]*)[)]', 'g');
	while (oStyles[i])
	{
		var sImage = oStyles[i++].style.backgroundImage;
		if (sImage)
		{
			sImage = sImage.replace(re, '$1');
			addImage(sImage);
		}
	}
	
	function addImage(sImage)
	{
		if (!aImgs[sImage])
		{
			aImgs[sImage]= new Image;
			aImgs[sImage].src = sImage;
		}
	}
}

// ****************************************************
// *******************  Temporary  ********************
// ****************************************************

function MakeXMLContactObject(delString)
{
	var tVals = ParseDelimitedList(delString);
	var objNode =  oSys.createElement("CONTACT");
	for (var i=0; i < cProps.length; i++)
	{
		var dataNode = oSys.createElement(cProps[i]);
		dataNode.text = tVals[i];
		objNode.appendChild(dataNode);
	}
	//root.appendChild(objNode);
	return objNode.cloneNode(true);
}

function GetRandomNum(num)
{
	return parseInt(Math.random() * num);
}

// ****************************************************
// ****************  GLOBAL VARS  *********************
// ****************************************************

var b_DEBUG_MODE = false;
var b_LOGGED_ON = false;
var bIsWebClient = true;

var sCurDiv = "CT";
var oComponents;

// ****************************************************
// *********************  MSXML  **********************
// ****************************************************

var bXMLProcessed = false;
var oText 	= new ActiveXObject("Msxml.DOMDocument");
var oConfig = new ActiveXObject("Msxml.DOMDocument");
var oSys 	= new ActiveXObject("Msxml.DOMDocument");
var xTmp 	= new ActiveXObject("Msxml.DOMDocument");

oConfig.onreadystatechange = CheckForCFG;
oText.onreadystatechange = CheckForXML;

// if you provide an http URL location, the load() method returns immediately and your
// document object is empty because the data hasn't come back from the server yet.
// setting async to false holds processing of the HTML document until the XML file has returned
oText.async = false;
oConfig.async = false;
oSys.async = false;

oText.preserveWhiteSpace = false;
oConfig.preserveWhiteSpace = false;
oSys.preserveWhiteSpace = false;

if (bIsIE55)
{
	oText.validateOnParse = false;
	oConfig.validateOnParse = false;
	oSys.validateOnParse = false;
}

oConfig.load("xConfig.xml");

var sSysXML = "";
sSysXML += "<R>";
sSysXML += "<ACCOUNT> </ACCOUNT>";
sSysXML += "<TEST> some text </TEST>";
sSysXML += "<LOGON></LOGON>";
sSysXML += "<AB></AB>";
sSysXML += "<BARS></BARS>";
sSysXML += "<BATCH></BATCH>";
sSysXML += "<CALL_LIST></CALL_LIST>";
sSysXML += "<CALL_LOGS></CALL_LOGS>";
sSysXML += "<CALL_STATES>";
sSysXML += 		"<STATE code='A' string='"+text('CL/STATE_A')+"'/>";
sSysXML += 		"<STATE code='B' string='"+text('CL/STATE_B')+"'/>";
sSysXML += 		"<STATE code='a' string='"+text('CL/STATE_a')+"'/>";
sSysXML += 		"<STATE code='C' string='"+text('CL/STATE_C')+"'/>";
sSysXML += 		"<STATE code='F' string='"+text('CL/STATE_F')+"'/>";
sSysXML += 		"<STATE code='G' string='"+text('CL/STATE_G')+"'/>";
sSysXML += 		"<STATE code='H' string='"+text('CL/STATE_H')+"'/>";
sSysXML += 		"<STATE code='h' string='"+text('CL/STATE_h')+"'/>";
sSysXML += 		"<STATE code='I' string='"+text('CL/STATE_I')+"'/>";
sSysXML += 		"<STATE code='N' string='"+text('CL/STATE_N')+"'/>";
sSysXML += 		"<STATE code='O' string='"+text('CL/STATE_O')+"'/>";
sSysXML += 		"<STATE code='P' string='"+text('CL/STATE_P')+"'/>";
sSysXML += 		"<STATE code='Q' string='"+text('CL/STATE_Q')+"'/>";
sSysXML += 		"<STATE code='R' string='"+text('CL/STATE_R')+"'/>";
sSysXML += 		"<STATE code='r' string='"+text('CL/STATE_r')+"'/>";
sSysXML += 		"<STATE code='u' string='"+text('CL/STATE_u')+"'/>";
sSysXML += 		"<STATE code='U' string='"+text('CL/STATE_U')+"'/>";
sSysXML += 		"<STATE code='x' string='"+text('CL/STATE_x')+"'/>";
sSysXML += 		"<STATE code='v' string='"+text('CL/STATE_v')+"'/>";
sSysXML += 		"<STATE code='.' string='"+text('CL/STATE_.')+"'/>";
sSysXML += "</CALL_STATES>";
sSysXML += "<COMPOSITES></COMPOSITES>";
sSysXML += "<DEVICES></DEVICES>";
sSysXML += "<DIRECTORIES></DIRECTORIES>";
sSysXML += "<FEATURE_CODE_LIST></FEATURE_CODE_LIST>";
sSysXML += "<GREETINGS></GREETINGS>";
sSysXML += "<GROUPS></GROUPS>";
sSysXML += "<MESSAGES></MESSAGES>";
sSysXML += "<NODES></NODES>";
sSysXML += "<PASSPORTS></PASSPORTS>";
sSysXML += "<RULES></RULES>";
sSysXML += "<STEPS></STEPS>";
sSysXML += "<SEARCH_RESULTS><TA></TA><TARRWO></TARRWO><TARRWA></TARRWA><DSRS></DSRS><NA></NA></SEARCH_RESULTS>";
sSysXML += "<STATUS_LIST></STATUS_LIST>";
sSysXML += "<SYNCH><SOURCES></SOURCES></SYNCH>";
sSysXML += "<SYSTEM_ACCOUNTS></SYSTEM_ACCOUNTS>";
sSysXML += "<TEMPORARY></TEMPORARY>";
sSysXML += "<TENANT_GROUPS></TENANT_GROUPS>";
sSysXML += "<TIMEZONES></TIMEZONES>";
sSysXML += "<TIMESTAMPS></TIMESTAMPS>";
sSysXML += "</R>";

oSys.loadXML(sSysXML);

var oRoot		= oSys.selectSingleNode("R");
var oActNode 		= oSys.selectSingleNode("R/ACCOUNT");
var oABNode		= oSys.selectSingleNode("R/AB");
var oBarsNode		= oSys.selectSingleNode("R/BARS");
var oSynchNode		= oSys.selectSingleNode("R/SYNCH");
var oSynchSourcesNode 	= oSys.selectSingleNode("R/SYNCH/SOURCES");
var oGroupsNode 	= oSys.selectSingleNode("R/GROUPS");
var oSearchNode		= oSys.selectSingleNode("R/SEARCH_RESULTS");
var oNodesNode		= oSys.selectSingleNode("R/NODES");
var oDevNode		= oSys.selectSingleNode("R/DEVICES");
var oCompStatusNode 	= oSys.selectSingleNode("R/COMPOSITES");
var oPassNode		= oSys.selectSingleNode("R/PASSPORTS");
var oFCNode		= oSys.selectSingleNode("R/FEATURE_CODE_LIST");
var oMsgNode		= oSys.selectSingleNode("R/MESSAGES");
var oCallListNode	= oSys.selectSingleNode("R/CALL_LIST");
var oCallLogNode	= oSys.selectSingleNode("R/CALL_LOGS");
var oDirNode		= oSys.selectSingleNode("R/DIRECTORIES");
var oSysActsNode	= oSys.selectSingleNode("R/SYSTEM_ACCOUNTS");
var oBatchNode 		= oSys.selectSingleNode("R/BATCH");
var oLogonNode 		= oSys.selectSingleNode("R/LOGON");
var oRulesNode 		= oSys.selectSingleNode("R/RULES");
var oGreetingsNode	= oSys.selectSingleNode("R/GREETINGS");
var oStepsNode 		= oSys.selectSingleNode("R/STEPS");
var oStatusListNode	= oSys.selectSingleNode("R/STATUS_LIST");
var oTenantGroupsNode 	= oSys.selectSingleNode("R/TENANT_GROUPS");
var oTimeZonesNode	= oSys.selectSingleNode("R/TIMEZONES");
var oTempNode		= oSys.selectSingleNode("R/TEMPORARY");
var oTimeNode		= oSys.selectSingleNode("R/TIMESTAMPS");


function GetDisplayName()
{
	var DisplayName;
	if(oActNode.selectSingleNode('ContactElements/CONTACT/FirstName').text)
	{
		DisplayName=oActNode.selectSingleNode('.//FirstName').text;
		DisplayName+=' ';
		DisplayName+=oActNode.selectSingleNode('.//LastName').text;
	}
	else if(oActNode.selectSingleNode('.//LastName').text!='')
		DisplayName=oActNode.selectSingleNode('.//LastName').text;
	else if (oActNode.selectSingleNode('.//MiddleName').text!='')
		DisplayName = oActNode.selectSingleNode('.//MiddleName').text;
	else	DisplayName="UnKnown";

	return DisplayName;
}

function GetEmailAddress()
{
	var EmailAddress;
	if(parseInt(oActNode.selectSingleNode('ContactElements/CONTACT/Emails/LIST/NumberOfObjects').text)>=1)
	{
		EmailAddress=oActNode.selectSingleNode('ContactElements/CONTACT/Emails/LIST/child0/STR/String').text;
//		alert("account has email address "+EmailAddress);
	}
	else 
	{
//		alert("account has no email address");
		EmailAddress = AddEmailAddressToAccount();
	}
/*commented for UC 4.0
	oActNode.setAttribute('readOnly', '1');
	BuildDiv('PI', oActNode);
	oActNode.removeAttribute('readOnly');
	*/
//	getObj('vl_PI').click();

	return EmailAddress;
}

function AddEmailAddressToAccount()
{
	var ret_vals = ParseDelimitedList(Dialog(text('DLG/AB/ADD_PRI'), 16));
	var isPrimaryEmail = false;
	var new_email = '';
	if (eval(ret_vals[0]))
	{
		new_email = ret_vals[1];
		isPrimaryEmail = ret_vals[2];
//		alert(new_email);
		new_email = TrimLength(new_email, INPUT_LIMIT_256, true);
		if (!IsValidEmailAddress(new_email))
		{
			alert("Please enter a valid e-mail address");
			//Comment this line and add enter a invalid email address to the account, to see the affect.
			//isPrimaryEmail is assigned false irrespective of whether it is checked or not. This is done because when the recursive function returns, it should not remember the old(incorrect) email address and add it to the account.
			isPrimaryEmail = false;	
			AddEmailAddressToAccount();
		}
		if(isPrimaryEmail == 'true')
		{
			var oObj = oActNode;			
			var oOldObj = oObj.cloneNode(true);
			var primaryEmail_root=oObj.selectSingleNode('ContactElements/CONTACT/Emails');
			AddChildNodeToListObject(primaryEmail_root,new_email);
			CallControlMethod('EditXMLObject', oOldObj, oObj);
//			alert("account edited");
		}
	}
	else
	{
		alert("Please enter a valid e-mail address");	
		AddEmailAddressToAccount();
	}
	
	return new_email;	
}

//config("NODE_NAME")

var COMPOSITE_STATUS_FLAGS_CreateByServer = new Number(0x0002);
var COMPOSITE_STATUS_FLAGS_ResetCreateByServer = new Number(0x01);

function CheckForCreateByServer()
{
//	var oObj = oCompStatusNode ;
//      var oOldObj = oObj.cloneNode(true);
	var children = oCompStatusNode.selectNodes('COMPOSITE_STATUS');
	var i=0, done=false, nFlags;
	
	while (children[i] && !done)
	{
		nFlags = parseFloat(children[i].selectSingleNode('Flags').text);
		if (nFlags & COMPOSITE_STATUS_FLAGS_CreateByServer)
		{

			//done = true;
			CheckForDynamicStatus(children[i]);
			//return;
		}
		i++;
	}

}

function GetDNDMessagesList()
{
	var newHtml, i = 0;
	var dndMessagesList = oNodesNode.selectNodes('NODE/DNDMessages');
	newHtml = "<row style=\"text-align:left;\">";
	newHtml += "<select name=\"DndMessages\" size=\"1\">";

	while (dndMessagesList[i])
	{
	   newHtml += "<option value='"+dndMessagesList[i].text+"'>"+ dndMessagesList[i].text+"</option>";
	   i++;
	}
	newHtml+= "</select>";
	newHtml+= "<t>17</t>";
	newHtml+= "</row>";
	//alert(newHtml);
	return newHtml;	
}

var INPUT_LIMIT_16 = "16";
function CheckForDynamicStatus(oProcessChildNode)
{
	if(!oDevNode.hasChildNodes)
	{
		Dialog(text('ERR/No_Device'), 0)	
		return;
	}
	if(!oCompStatusNode.hasChildNodes)
	{
		Dialog(text('ERR/No_Status'), 0)	
		return;
	}	
	//var devices = oDevNode.selectNodes('DEVICE/Extension');
	var devices = oDevNode.selectNodes('DEVICE[OwnerAccount="'+oActNode.selectSingleNode('.//UniqueID').text+'"]/Extension');
	if(devices.length==0)
	{
		Dialog(text('ERR/No_Device'), 0)	
		return;
	}
	var additional_Phones = oRoot.selectNodes("CONTACT_FIELDS/FIELD[@locType and @type='TYPE_STRING_PHONE']");
//	var primary_device = oDevNode.firstChild;
//	check for primary device bit set in flags field
//	while (primary_device && !(DEVICE_FLAG_IS_PRIMARY & parseFloat(primary_device.selectSingleNode('Flags').text)))
//		primary_device = primary_device.nextSibling;	
//			x+=					"<xsl:for-each select=\"/R/CONTACT_FIELDS/FIELD[@locType and @type='TYPE_STRING_PHONE']\">";
//			x+=						"<xsl:if test=\"/R/ACCOUNT//CONTACT/*[nodeName() = context(-1)/@name and value() != '']\">";
//			x+=							"<option><xsl:attribute name=\"type\"><xsl:value-of select=\"@locType\" /></xsl:attribute><xsl:attribute name=\"property\"><xsl:value-of select=\"@name\" /></xsl:attribute><xsl:value-of select=\".\" /></option>";
//			x+=						"</xsl:if>";
//			x+=					"</xsl:for-each>";

//step 1 Drop Down menu to select your current Location

	var y = "<row style=\"text-align:left;\">", i=0;
	y+= "<label for=\"Location\">1. Select your Current Location: </label>";
	y+="<select id=\"cs_location_name_unique\" size=\"1\" name=\"location_name\" onchange=\"populateDeviceNumberField()\">";
	y+= "<option value=\"0\">---Choose One---</option>";
	while (devices[i])
	{
		y+= "<option value='"+devices[i].text+"'>"+devices[i].text+"</option>";
		i++
	}
	i = 0;
	var account = oActNode.selectNodes("ContactElements/CONTACT/*");
	var flag_dontAddToList = 0;
	while (additional_Phones[i])
	{
		flag_dontAddToList = 0;
		var j = 0;
		while(account[j])
		{
			if((account[j].nodeName == additional_Phones[i].attributes[0].text) && (account[j].text != ''))
			{
				var k=0;
				flag_dontAddToList = 0;
				while (devices[k])
				{
					if(devices[k].text == account[j].text)
					{
						flag_dontAddToList = 1;	
						break;
					}
					k++;
				}
				if(flag_dontAddToList != 1)
					y+= "<option value='"+account[j].text+"'>"+account[j].text+"</option>";
			}
			j++;
			//if(additional_Phones[i].attributes[0].text == account[j].nodeName) and (flag_dontAddToList == 1) 
			// this means that this phone number is also a device and is already added to the dropdown list.
			// therefore we skip checking furthur and exit this loop.
			if(flag_dontAddToList == 1)
				break;
		}
		i++
		account = oActNode.selectNodes("ContactElements/CONTACT/*");		
	}

	y+= "<option value=\"1\">["+text('CS/CUST')+"]</option>";
	y+= "</select>";
	y+= "</row>";
	y+= "<row>";
	y+= 	"<labelAtEnd for=\"Custom_Text\" id=\"enter_Custom_Location_text\" style=\"display:none\">Please select your Custom Device: </labelAtEnd>";
	y+= 	"<inputAtEnd type=\"text\" id=\"DeviceNumberField\" style=\"display:none\" />";
	y+= "<HR></HR>";
	y+= "</row>";

//Step 1.5 select the DND message for new messages

	if(!oProcessChildNode)
	{
		y+= "<row>";
		y+= "<label for=\"DNDMessage\">2. Select your DND message: </label>";
		y+= "<select id=\"DND_select\" size=\"1\" name=\"DNDList\">";
		y+= "<option value=\"0\">-----Off-----</option>";
		var oDNDList= oNodesNode.firstChild.selectSingleNode('DNDMessages/LIST');
		var oDNDText = oNodesNode.firstChild.selectNodes('DNDMessages/LIST/*/STR/String');
		for(var i=1; i <= parseInt(oDNDList.selectSingleNode('NumberOfObjects').text);i++)
		{
			y+= "<option value='"+i+"'>"+oDNDText[i-1].text+"</option>";
		}
		y+= "</select>";
		y+= "<HR></HR>";
		y+= "</row>";	
	}

//step 2 CheckBox to select your availability

	y+= "<row>";
	if(!oProcessChildNode)
		y+= "<label for=\"Availability_At_Location\" style=\"text-align:left\">3.      Availability: </label>";
	else
		y+= "<label for=\"Availability_At_Location\" style=\"text-align:left\">2.      Availability: </label>";

	y+= "<input type=\"radio\" name=\"Availability_Location\" id=\"Avail_0\" value=\"Available\"><labelAtEnd for=\"Availability_Location\">  Available </labelAtEnd></input>";
	y+= "<input type=\"radio\" name=\"Availability_Location\" id=\"Avail_1\" value=\"Unavailable\" checked=\"yes\"/><labelAtEnd for=\"Availability_Location\"> Unavailable </labelAtEnd>";
	y+= "<HR></HR>";
	y+= "</row>";	

//step 3 Checkbox to specify optional additional message

	y+= "<row>";
	if(!oProcessChildNode)
		y+= "<label for=\"Availability_At_Location\" style=\"text-align:right\">4.      Additional Text: (Optional) </label>";
	else
		y+= "<label for=\"Availability_At_Location\" style=\"text-align:right\">3.      Additional Text: (Optional) </label>";

	y+= "<input type=\"radio\" name=\"Additional_text\" id=\"Additional_1\" value=\"Dynamic\" onclick=\"hideAdditionalStaticText()\"><labelAtEnd for=\"Additional_text\"> Dynamic </labelAtEnd> </input>";
	y+= "<input type=\"radio\" name=\"Additional_text\" id=\"Additional_0\" value=\"Static\" onclick=\"showAdditionalStaticText()\" /><labelAtEnd for=\"Additional_text\"> Static </labelAtEnd>";
	y+= "</row>";
	y+= "<row>";
	y+= "<inputAtEnd type=\"text\" id=\"Additional_Static_text\" style=\"display:none\" maxlength=\""+ INPUT_LIMIT_16 +"\"/>";
	y+= "<HR></HR>";
	y+= "</row>";
			
	
//	var newHtml;
//	i = 0;
//	var dndMessagesList = oNodesNode.selectNodes('NODE/DNDMessages/LIST/*/STR/String');
//	newHtml = "<row style=\"text-align:left;\">";
//	newHtml += "<select name=\"DndMessages\" size=\"1\">";
//	newHtml += "<option value=\"off\">----OFF----</option>";
//
//	while (dndMessagesList[i])
//	{
//	   newHtml += "<option value='"+i+"'>"+ dndMessagesList[i].text+"</option>";
//	   i++;
//	}
//	newHtml+= "</select>";
//	newHtml+= "<t>18</t>";
//	newHtml+= "</row>";	
//	//alert(newHtml);
//	

//Show the dialog
	
	if(oProcessChildNode)
	{
		var ret_vals = ParseDelimitedList(Dialog(Insert(oProcessChildNode.selectSingleNode('Description').text, text('DLG/AB/ADD_STAT')), 18, y));
	}
	else
	{
		var ret_vals = ParseDelimitedList(Dialog(text('DLG/AB/Quick_Status'), 19, y));		
	}
//Evaluate the results of the dialog

	if (eval(ret_vals[0]))
	{
		if(oProcessChildNode)
		{
			var oOldObj = oProcessChildNode.cloneNode(true);
			// reset the dynamic creation flag
			oProcessChildNode.selectSingleNode('Flags').text = parseFloat(oProcessChildNode.selectSingleNode('Flags').text) & COMPOSITE_STATUS_FLAGS_ResetCreateByServer;
			if(ret_vals[2] != "[CUSTOM]")
			{
				var k=0;
				var is_Device = 0;
				while (devices[k])
				{
					if(devices[k].text == ret_vals[3])
					{
						//set the current location as nodeID:extension
						oProcessChildNode.selectSingleNode('LocationNumber').text = oDevNode.selectSingleNode('DEVICE/NodeID[../Extension="'+ret_vals[3]+'"]').text;
						oProcessChildNode.selectSingleNode('LocationNumber').text += ':';
						oProcessChildNode.selectSingleNode('LocationNumber').text += ret_vals[3];
	
						//Set the location Name
						oProcessChildNode.selectSingleNode('LocationName').text = oDevNode.selectSingleNode('DEVICE/Name[../Extension="'+ret_vals[3]+'"]').text;
						is_Device = 1;
						oProcessChildNode.selectSingleNode('LocationType').text = 1;
						break;
					}
					k++;
				}
				if(is_Device != 1)
				{
					var phoneLocationName = oActNode.selectSingleNode('ContactElements/CONTACT/*[.="'+ret_vals[3]+'"]').nodeName;
					oProcessChildNode.selectSingleNode('LocationType').text = oRoot.selectSingleNode('CONTACT_FIELDS/FIELD[@name="'+phoneLocationName+'"]/@locType').text;
					oProcessChildNode.selectSingleNode('LocationNumber').text = '';
					oProcessChildNode.selectSingleNode('LocationName').text = '';
				}
			}
			else
			{
				oProcessChildNode.selectSingleNode('LocationNumber').text = ret_vals[3];
				oProcessChildNode.selectSingleNode('LocationName').text = '';
				// Set the Location Type. 0 - Custom, 1 - Device, other number from 2 to 9 are phone numbers from your account
				oProcessChildNode.selectSingleNode('LocationType').text = 0;
			}
			//Set your availability
			oProcessChildNode.selectSingleNode('Available').text = (ret_vals[4] == "Available") ? "TRUE" : "FALSE" ;

			if(ret_vals[5] == "Static")
			{
				var secondaryMsg=oProcessChildNode.selectNodes('DeviceSettings/LIST/*/DEVICE_STATUS/SecondaryMessage');
				var i=0;
				while(secondaryMsg[i])
				{
					//Set Static text to all the devices
					oProcessChildNode.selectNodes('DeviceSettings/LIST/*/DEVICE_STATUS/SecondaryMessage')[i].text = ret_vals[6];
					i++;
				}
			}
			else if(ret_vals[5] == "Dynamic")
			{
				//Dynamic Status
				oProcessChildNode.selectSingleNode('DynamicStatus').text = 'TRUE';
			}
			CallControlMethod('EditXMLObject', oOldObj, oProcessChildNode);
			if (oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS/CurrentCompositeStatus').text == oProcessChildNode.selectSingleNode('Description').text)
			{
				var oOldStatusNode = oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS').cloneNode(true);
				if(ret_vals[5] == "Dynamic")
				{
					var new_dynamic_status = PromptForDynamicStatus();
					oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS/CurrentDynamicStatus').text = new_dynamic_status;
				}
				oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS/Available').text = (ret_vals[4] == "Available") ? "TRUE" : "FALSE";
				CallControlMethod('EditXMLObject', oOldStatusNode, oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS').cloneNode(true));
				
				UpdateStatusListItem(oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS').cloneNode(true));
			}
		}
		else
		{
			//If the DND status you have choosen already exists then we have to just edit it and not try to recreate it.
			var ostatuses = oCompStatusNode.selectNodes('COMPOSITE_STATUS');
			var counter = 0,status_exists=0;
			if(ret_vals[4]=="-----Off-----")
				ret_vals[4] = "Available";
			while(ostatuses[counter])
			{
				if(ostatuses[counter].selectSingleNode('Description').text == ret_vals[4])
				{
					status_exists=1;
					oProcessChildNode = ostatuses[counter];
					break;
				}
				counter++;
			}
			if(status_exists==0)
				oProcessChildNode = oCompStatusNode.firstChild.cloneNode(true);

			var oOldObj = oProcessChildNode.cloneNode(true);
			// reset the dynamic creation flag
			oProcessChildNode.selectSingleNode('Flags').text = parseFloat(oProcessChildNode.selectSingleNode('Flags').text) & COMPOSITE_STATUS_FLAGS_ResetCreateByServer;
			oProcessChildNode.selectSingleNode('Description').text = ret_vals[4];
			if(ret_vals[2] != "[CUSTOM]")
			{
				var k=0;
				var is_Device = 0;
				while (devices[k])
				{
					if(devices[k].text == ret_vals[5])
					{
						//set the current location as nodeID:extension
						oProcessChildNode.selectSingleNode('LocationNumber').text = oDevNode.selectSingleNode('DEVICE/NodeID[../Extension="'+ret_vals[5]+'"]').text;
						oProcessChildNode.selectSingleNode('LocationNumber').text += ':';
						oProcessChildNode.selectSingleNode('LocationNumber').text += ret_vals[5];
	
						//Set the location Name
						oProcessChildNode.selectSingleNode('LocationName').text = oDevNode.selectSingleNode('DEVICE/Name[../Extension="'+ret_vals[5]+'"]').text;
						is_Device = 1;
						oProcessChildNode.selectSingleNode('LocationType').text = 1;
						break;
					}
					k++;
				}
				if(is_Device != 1)
				{
					var phoneLocationName = oActNode.selectSingleNode('ContactElements/CONTACT/*[.="'+ret_vals[5]+'"]').nodeName;
					oProcessChildNode.selectSingleNode('LocationType').text = oRoot.selectSingleNode('CONTACT_FIELDS/FIELD[@name="'+phoneLocationName+'"]/@locType').text;
					oProcessChildNode.selectSingleNode('LocationNumber').text = '';
					oProcessChildNode.selectSingleNode('LocationName').text = '';
				}
			}
			else
			{
				oProcessChildNode.selectSingleNode('LocationNumber').text = ret_vals[5];
				oProcessChildNode.selectSingleNode('LocationName').text = '';
				// Set the Location Type. 0 - Custom, 1 - Device, other number from 2 to 9 are phone numbers from your account
				oProcessChildNode.selectSingleNode('LocationType').text = 0;
			}
			//Set your availability
			oProcessChildNode.selectSingleNode('Available').text = (ret_vals[6] == "Available") ? "TRUE" : "FALSE" ;
			
			var k=0;
			while (devices[k])
			{
				if(ret_vals[4]=="Available")
					oProcessChildNode.selectNodes('DeviceSettings/LIST/*/DEVICE_STATUS/PrimaryMessage')[k].text = '';
				else
					oProcessChildNode.selectNodes('DeviceSettings/LIST/*/DEVICE_STATUS/PrimaryMessage')[k].text = ret_vals[4];
				k++;
			}

			if(ret_vals[7] == "Static")
			{
				var secondaryMsg=oProcessChildNode.selectNodes('DeviceSettings/LIST/*/DEVICE_STATUS/SecondaryMessage');
				var i=0;
				while(secondaryMsg[i])
				{
					//Set Static text to all the devices
					oProcessChildNode.selectNodes('DeviceSettings/LIST/*/DEVICE_STATUS/SecondaryMessage')[i].text = ret_vals[8];
					i++;
				}
			}
			else if(ret_vals[7] == "Dynamic")
			{
				//Dynamic Status
				oProcessChildNode.selectSingleNode('DynamicStatus').text = 'TRUE';
			}
			if(status_exists==0)
			{
				oCompStatusNode.appendChild(oProcessChildNode);
				CallControlMethod('AddXMLObject', oProcessChildNode);
			}
			else
				CallControlMethod('EditXMLObject', oOldObj, oProcessChildNode);
			if (oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS/CurrentCompositeStatus').text == oProcessChildNode.selectSingleNode('Description').text)
			{
				var oOldStatusNode = oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS').cloneNode(true);
				if(ret_vals[7] == "Dynamic")
				{
					var new_dynamic_status = PromptForDynamicStatus();
					oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS/CurrentDynamicStatus').text = new_dynamic_status;
				}
				oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS/Available').text = (ret_vals[6] == "Available") ? "TRUE" : "FALSE";
				CallControlMethod('EditXMLObject', oOldStatusNode, oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS').cloneNode(true));
				
				UpdateStatusListItem(oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS').cloneNode(true));
			}
		}

	}
	DisplayAccountStatus();
	table['CS'].refresh();
}


function CheckForCFG()
{

	if (oConfig.readyState == "4")
	{
		CheckError(oConfig);
		if (oConfig.documentElement.parsed)
		{
			// attepmt to load xml string based on browser's language - if it fails
			// CheckForXML will load a file based on the config file
			var sFileName = "xUserLabels_"+ config('DEFAULT_LANG') +".xml";
			oText.load(sFileName);
		}
	}
}

var oTabs;
var oObjConfig;

function CheckForXML()
{
	if (oText.readyState == "4")
	{
		CheckError(oText);
		if (oText.documentElement && oText.documentElement.parsed)
		{
			oObjConfig 	= oText.selectSingleNode('LABELS/OBJECTS');
			oTabs 		= oText.selectSingleNode('LABELS/FILTER_TABS');
			oComponents = oText.selectSingleNode('LABELS/COMPONENTS');
			b_DEBUG_MODE = eval(config('FLAGS'));
			bXMLProcessed = true;
		}
	}
}

function CheckError(oXMLObj)
{
	if (oXMLObj.parseError.errorCode != 0)
		XMLError(oXMLObj.parseError);
}

function XMLError(oErrObj)
{
	var msg = "";
	// don't show an error message for loading the user label file - default will be loaded
	if (oErrObj.errorCode == -2146697210 && oErrObj.url.indexOf("xUserLabels_")==0)
		return false;
	else
	{
		msg += oErrObj.reason + "\n";
		msg += oErrObj.url + "\n";
		msg += "line: "+oErrObj.line + "\n";
		msg += "pos: "+oErrObj.linepos + "\n";
		msg += "src: ("+oErrObj.srcText.substring((oErrObj.linepos-30), (oErrObj.linepos+30)) + ")\n";
		msg += oErrObj.srcText;
	}
	alert(msg);
}


// ****************************************************
// *****************  Global XML Methods  *************
// ****************************************************

function boolVal(oNode)
{
	return eval(oNode.text.toLowerCase());
}

function RemoveChildNodes(oNode)
{
	while (oNode.firstChild)
		oNode.removeChild(oNode.firstChild)
}

function GetTemplate(sObjName)
{
	return CallControlMethod("GetEmptyXMLObject", sObjName).firstChild;
}

function AddNode(oParent, sNewName)
{
	oParent.appendChild(oSys.createElement(sNewName));
	return oParent.selectSingleNode(sNewName);
}


function AddChildNodeToListObject(oParent, oStringOrObject)
{
	var oList = oParent.selectSingleNode("LIST");
	var oType = oList.selectSingleNode("ObjectsType");
	var oNumber = oList.selectSingleNode("NumberOfObjects");
	var oChild = oSys.createElement("child"+oNumber.text);
	var sPath, oSTRObj;
	switch (oType.text)
	{
		case "STR":
			if (oNumber.text=="0")
			{
				var sStringObjXML = "<STR><String></String></STR>";
				var oSTRObj = new ActiveXObject("Msxml.DOMDocument");
				oSTRObj.loadXML(sStringObjXML);
				oSTRObj = oSTRObj.firstChild;
			}
			else
				var oSTRObj = oList.lastChild.firstChild.cloneNode(true);
			oSTRObj.firstChild.text = oStringOrObject;
			oChild.appendChild(oSTRObj.cloneNode(true));
			sPath = ".//String";
			break;
		
		case "FEATURE_CODE":
			oChild.appendChild(oStringOrObject);
			sPath = "*/FEATURE_CODE";
			break;
		
		case "DEVICE_STATUS":
			oChild.appendChild(oStringOrObject);
			sPath = "*/DEVICE_STATUS";
			break;
		
		default:
			oChild.appendChild(oStringOrObject);
			if (!oType.text)
			{
				oType.text = ((oStringOrObject.xml) ? oStringOrObject.nodeName : oStringOrObject);
				sPath = '*/'+ ((oStringOrObject.xml) ? oStringOrObject.nodeName : oStringOrObject);
			}
			break;
	}
	// if the list is empty - use the string above to create the childnode
	// oString = oChild.selectSingleNode("*/String");
	oList.appendChild(oChild);
	oNumber.text = oList.selectNodes(sPath).length;
}

function RemoveChildNodeFromListObject(oParent, oStringOrObject)
{
	var oList = oParent.selectSingleNode('LIST');
	var oType = oList.selectSingleNode('ObjectsType');
	var oNumber = oList.selectSingleNode('NumberOfObjects');
	
	switch (oType.text)
	{
		case 'STR':
			oChild = oList.selectSingleNode('*[STR/String="'+oStringOrObject+'"]');
			path = 'LIST/*/STR';
			break;
		
		case 'DEVICE_STATUS':
		case 'FEATURE_CODE':
			oChild = oStringOrObject.parentNode;
			path = 'LIST/*/'+ oType.text;
			break;
	}
	if (oChild)
		oList.removeChild(oChild);
		
	var children = oParent.selectNodes('LIST/*/'+ oType.text), i=0, j=0, aNodesToCopy=new Array;
	// remove existing childXXX nodes
	while (children[i])
	{
		var oNewChildNode = oSys.createElement('child'+i);
		oNewChildNode.appendChild(children[i].cloneNode(true));
		aNodesToCopy[aNodesToCopy.length] = oNewChildNode;
		oList.removeChild(children[i++].parentNode);
	}
	// append newly numbered childXXX nodes created above
	while (aNodesToCopy[j])
		oList.appendChild(aNodesToCopy[j++])

	oNumber.text = children.length;
}

// ****************************************************
// *****************  DATA & LABELS  ******************
// ****************************************************

function SetXMLVars(array, curNode)
{
	for (var i=0; i < curNode.childNodes.length; i++)
		array[curNode.childNodes.item(i).nodeName] = BuildSubNode(curNode.childNodes.item(i));
}

function BuildArray(arrayName, currNode)
{
	for (var j=0; j < currNode.childNodes.length; j++)
		arrayName[arrayName.length] = currNode.childNodes.item(j).nodeValue;
}

// ****************************************************
// *******************  INTERFACE  ********************
// ****************************************************

function config(sNodeName)
{
	return oConfig.selectSingleNode('CONFIG/'+sNodeName).text
}

function text(path)
{
	var node = oText.selectSingleNode('LABELS/INTERFACE_LABELS/'+path);
	return (node) ? node.text : null;
}

function tip(path)
{
	var node = oText.selectSingleNode('LABELS/TOOL_TIPS/'+path);
	return (node) ? node.text : null;
}

function CreateContentDivs()
{
	var x="", y="";
	var child = oComponents.firstChild
	while (child)
	{
		if (child.getAttribute("rootView") == "1")
			x+= CreateSingleDiv(child);
		child=child.nextSibling;
	}
	x+= CreateSingleDiv(oComponents.selectSingleNode("CONTENT[@abbr='ED']"));
	getObj("main").innerHTML = x;
	y = "<div><OBJECT ID='WebController'";
	y+= " CLASSID='"+ config('CLIENT_CLASSID') +"' HEIGHT='1' WIDTH='1'";
	y+= " codebase='"+ config('WEB_PROTOCOL') + config('WEB_SERVER') + config('URL_WEB_ROOT') + config('WEBCODE_PATH') +"WebClient.cab#Version="+ config('CLIENT_VERSION') +"'";
	y+= " TABINDEX='-1'>";
	y+= "<PARAM NAME='ServerIP' VALUE='"+ config('SERVER') +"'>";
	y+= "<PARAM NAME='Port' VALUE='"+ config('PORT') +"'>";
	y+= "<PARAM NAME='Flags' VALUE='"+ config('FLAGS') +"'>";
	y+= "<PARAM NAME='ProductName' VALUE='"+ config('PRODUCT_NAME') +"'>";
	y+= "</OBJECT></div>";
	y+= "<div id='LIST' style='position:absolute;z-index:20;display:none' onmouseout='HandleListMenuOut();' onclick='Hide(\"LIST\");HideShadows();ResetListStyle()'></div>";

	document.body.innerHTML += y;
}

function CreateSingleDiv(child)
{
	var abbr = child.getAttribute("abbr");
	var x = "<div id='"+ abbr +"' class='section' style='display:none'>";
	var title_div = "<div class='title'>{1} <span>{0}</span></div>";
	var icon;// = (abbr=='TA'||abbr=='CL') ? "<img src='img/iCloseBox.gif' onclick='CloseCallControlElement(\""+abbr+"\")'>" : "";
	x+= InsertMultiple(new Array(child.text, icon), title_div);

	if (child.getAttribute('type')=='table')
		x+= "<div id='table"+ abbr +"' class='table'></div>";

	else if (child.getAttribute('type')=='tabs')
		x+= "<div id='tabs"+ abbr +"' class='tabs'></div>";
	
	else if (child.getAttribute('type')=='mixed')
		x+= "<div id='mixed"+ abbr +"' class='mixed'></div>";	
		
	x+= "<div id='"+ abbr +"EX' style='display:none'></div>";
	x+= "<div id='buttons' class='section_buttons'></div>";
	x+= "</div>";
	return x;
}

function BuildMenus()
{
	var x = "<div class='spacer'></div>";
	x+= "<div id='menu1' class='menu'>";
//	x+= "<div class='menuhead'></div>";
	x+= "<div class='menubody'>";
	x+= 	"<div id='view_link_list'\">";
	var aRootNodes = oComponents.selectNodes("CONTENT[@rootView='1' or @rootView='2']"); i=0;	
	var aSecondaryNodes = oComponents.selectNodes("CONTENT[@rootView='2']");	
	x+= "<table align='center' width='95%' cellpadding='0%' cellspacing='0%'>";
	x+= "<tr>";
	while (aRootNodes[i])
	{
		x+= "<td align='center'>";				
		x+= 	"<a href='javascript://'> ";
		x+= 		"<div class='view_link_tabdn_center' ";
		x+= 			"type='"+ aRootNodes[i].getAttribute("abbr") +"'";
		x+= 			"id='vl_"+ aRootNodes[i].getAttribute("abbr") +"'";
		x+=			"style='cursor:hand'";			
		if(aRootNodes[i].getAttribute("rootView")=='2')
		x+=			";'display:none'";
		x+= 			"onclick='ToggleLink(this, \""+aRootNodes[i].getAttribute("abbr")+"\");'";
		x+= 			"title='"+ text('GBL/SHOW')+' '+aRootNodes[i].text + "'>";	
		x+= 			"<div class='view_link_tabdn_right' ";
		x+= 				"id='vl_tabup_right_"+ aRootNodes[i].getAttribute("abbr") +"' >";	
		x+= 				"<div class='view_link_tabdn_left' ";				
		x+= 					"id='vl_tabup_left_"+ aRootNodes[i].getAttribute("abbr") +"' >";
		x+=						aRootNodes[i++].text;
		x+= 				"</div>";
		x+= 			"</div>";
		x+= 		"</div>";
		x+= 	"</a>";
		x+= "</td>";
	}
	x+=" </tr> </table>";
	x+= 	"</div>";
	x+= "</div></div>";
	x+= "<div id='menu2' class='menu'>";
//	x+= "<div class='menuhead'></div>";
	x+= "<div class='menubody'>";
	x+= 	"<div id='view_link_list'>";
	x+= 		BuildXMLNodeDisplayLinks() + "<br/>";
	x+= 	"</div>";
	x+= "</div></div>";
	getObj('menus').innerHTML = x;
	getObj('menu2').style.display = (b_DEBUG_MODE) ? '' : 'none';
}


function xmenu()
{
	getObj('menu2').style.display = '';
}

function BuildXMLNodeDisplayLinks()
{
	var x = "<span style=\"height:100px;margin-left:20px\">XML Nodes <br />";
	var child = oSys.firstChild;
	x+= "<a href=\"javascript://\" onclick=\"xml('"+child.nodeName+"')\" style=\"font-weight:normal;\">Show All XML</a><br/>";
	child = child.firstChild;
	while (child)
	{
		x+= "<a href=\"javascript://\" onclick=\"xml('R/"+child.nodeName+"')\" style=\"font-weight:normal;\">"+child.nodeName+"</a><br/>";
		child = child.nextSibling;
	}
	x+= "<a href=\"javascript://\" onclick=\"javascript:AlertCall()\" style=\"font-weight:normal;\">[Fake Call]</a><br/>";
	x+= "<a href=\"javascript://\" onclick=\"javascript:DeleteSteps()\" style=\"font-weight:normal;\">[Delete Steps]</a><br/>";
	x+= "<a href=\"javascript://\" onclick=\"javascript:FakeProgress()\" style=\"font-weight:normal;\">[Fake Progress]</a><br/>";
	x+= "<a href=\"javascript://\" onclick=\"javascript:ShowTimestamps()\" style=\"font-weight:normal;\">[Show Timestamps]</a><br/>";
	x+= "<a href=\"javascript://\" onclick=\"javascript:ShowContactWizard()\" style=\"font-weight:normal;\">[Show Contact Import]</a><br/>";
	x+= "<a href=\"javascript://\" onclick=\"javascript:PlaceBulkCalls()\" style=\"font-weight:normal;\">[Place Calls]</a><br/>";
	x+= "</span>";
	return x;
}

function BuildInterface()
{
	var ResWidth = 1024;				//desired resolution width
	var ResHeight = 768;				//desired resolution height
	if( (screen.width > ResWidth) || (screen.height > ResHeight) ){		
		//if user screen resolution greater than 1024 x 768, resize window to 1024 x 768
		window.moveTo(0,0);
		window.resizeTo(ResWidth, ResHeight);
	}

	if (bXMLProcessed)
	{	
		oRoot.appendChild(oText.selectSingleNode('LABELS/FORMATTING').cloneNode(true));
		var oFeatureCodeSupport = oConfig.selectSingleNode('.//FEATURE_CODE_SUPPORT');
		oRoot.appendChild(oFeatureCodeSupport.parentNode.removeChild(oFeatureCodeSupport));
		oRoot.appendChild(oText.selectSingleNode('LABELS/CONTACT_FIELDS'));
		PreloadStylesheetImages();
		CreateContentDivs();
		BuildMenus();
		if (bIsIE5 || bIsIE55)
		{
			var ret = window.open("", "", "width=0, height=0, left=5000, top=5000,location=no, menubar=no, status=no, toolbar=no, scrollbars=no, resizable=no");
			window.focus();
			/*if (ret)
			{
				ret.blur();
				window.focus();
				ret.close();
			}*/
			
			if (!ret)
			{
				Hide("LOADING");
				BuildDiv('POPUP');
				Show("POPUP");			   
			}
			else
			{
				ret.close();				  



				SetDocumentTitle();
				BuildCallNotification();
				CaptureEvents();
				BuildDiv('LOGON');
				BuildDiv('CT');
				BuildDiv('newCallAndSearch');
	//			BuildDiv('CallControl');
				BuildDiv('CS');
				BuildDiv('DS');
	//			BuildDiv('GP');
	//			BuildDiv('GT');
				BuildDiv('AC');
				BuildDiv('RL');
//				BuildDiv('CB');		//Collaborate Tab Content loads in SubmitLogon()

				BuildTable('AB');
				BuildTable('CG');
				BuildTable('CS');
				BuildTable('DSFM');
				BuildTable('DSRS');
	//			BuildTable('DV');
	//			BuildDiv('dv_feature_codes');
				BuildTable('GT');
				BuildTable('MS');
				BuildTable('RR');
	//			BuildTable('TA');			
				BuildTable('CL');
				InsertDiv('CT', 'ABSY');
				getObj('AC').style.display = "none";
				getObj('vl_AC').style.display = "none";
				CheckForRegistryValues();
			}

		}
	}
	else
		setTimeout("BuildInterface()", 1000);
}

function CheckForRegistryValues()
{
	if (!bControlLoaded)
		setTimeout('CheckForRegistryValues()', 1000);
	else
	{
		var aRegVals = GetRegistryValues();
		bAutoLogon = (aRegVals && aRegVals[1] != '') ? true : false;
		if (aRegVals)
		{
			bRegistryValues = true;
			getObj('logon_username').value = aRegVals[0];
			if (!bAutoLogon)
				getObj('logon_auto').checked = (aRegVals[2]) ? eval(aRegVals[2]) : false;
			else
				AutoLogon(aRegVals);
		}
		else
			getObj('logon_auto').checked = true;
	
		CompleteInitialization();
	}
}

function GetRegistryValues()
{
	var aRegVals = new Array;
	aRegVals[0] = CallControlMethod('ReadCookie', 'Username');
	aRegVals[1] = CallControlMethod('ReadCookie', 'Password');
	aRegVals[2] = CallControlMethod('ReadCookie', 'AutoLoginPreference');
	var sRegVals = aRegVals.join('^');
	return ((aRegVals[0] != 'unable to match on command "ReadCookie"' && sRegVals.length>2) ? aRegVals : null);
}

function SetRegistryValues(sUsername, sEncryptedPassword, bCheckboxChecked)
{
	if (!bRegistryValues || (bRegistryValues && (sRegistryUsername != sUsername)) || bCheckboxChecked)
	{
		var sPassword = (bCheckboxChecked) ? sEncryptedPassword : '';
		CallControlMethod('WriteCookie', 'Username', sUsername);
		CallControlMethod('WriteCookie', 'Password', sPassword);
		CallControlMethod('WriteCookie', 'AutoLoginPreference', bCheckboxChecked);
	}
}

function CompleteInitialization()
{
	ResizeBrowserWindow();
	XMLObjectListBlock('TIME_ZONE_INFO', CallControlMethod('GetListOfTimeZoneNames'));

	// check for running tray client update if update is required
	var update_result = CallControlMethod('UpdateTrayClient');
	while (update_result=='Error. TrayClient still active.')
	{
		var link = '<link onclick=\"javascript:window.open(\''+ config('HELP_FILE_NAME') +'\')\">'+ text('MS/CLK_HERE') +'</link>';
		var ret_vals = ParseDelimitedList(Dialog(Insert(link,text('DLG/TRAY_CLIENT_ACTIVE')),13));
		if (!eval(ret_vals[0]))
			break;
			
		update_result = CallControlMethod('UpdateTrayClient');
	}
	
	if (!bRegistryValues)
	{
		BuildDiv('PREF');
		Hide('LOADING');
		Show("PREF");
	}
	else
	{
		// Give the ActiveX control a chance to update the shortcuts in case the URL has changed.
		CallControlMethod('InstallShortcuts', '');
		if (!bAutoLogon)
			ShowLogon();
	}
}

function CheckInternationalSettingsObject(oIntlSettings)
{	
	var oIntlSettingsNew	= oIntlSettings.cloneNode(true);
	var oIntlSettingsOld 	= oIntlSettings.cloneNode(true);
	
	var format_index=0, string_index=0;
	
	var formatting_nodes = oText.selectNodes('LABELS/FORMATTING/*/*');
	var string_nodes = new Array;
	
	// add the node for 'External call' to insure server strings are updated
	string_nodes[string_nodes.length] = oText.selectSingleNode('LABELS/INTERFACE_LABELS/CL/Trunk').cloneNode(true);
	
	while (formatting_nodes[format_index])
	{
		updateInternationalValue(formatting_nodes[format_index].nodeName, formatting_nodes[format_index].text);
		format_index++;
	}
	
	while (string_nodes[string_index])
	{
		updateInternationalValue(string_nodes[string_index].nodeName, string_nodes[string_index].text);
		string_index++;
	}
	
	if (oIntlSettingsNew.xml != oIntlSettingsOld.xml)
		CallControlMethod('EditXMLObject', oIntlSettingsOld, oIntlSettingsNew);
		
	function updateInternationalValue(target_string, replace_string)
	{
		var child = oIntlSettingsNew.selectSingleNode('InternationalizedNames/LIST/child0');
		while (child)
		{
			if (target_string == child.selectSingleNode('STR/String').text)
			{
				oIntlSettingsNew.selectSingleNode(Insert(child.nodeName, 'InternationalizedValues/LIST/{0}/STR/String')).text = replace_string;
				return;
			}
			child = child.nextSibling;
		}
	}
}

function SetPreferences()
{
	var prefs = new Array(
		getObj('upWCDS').checked,
		getObj('upWCFS').checked,
		getObj('upWCLA').checked,
		getObj('upTCDS').checked,
		getObj('upTCLA').checked,
		getObj('upTCLN').checked);

	CallControlMethod('InstallShortcuts', DelimitList(prefs));
	getObj('PREF').innerHTML = '';
	Hide('PREF');
	ShowLogon();
}

function ConfigurePreferencesCheckboxes()
{
	getObj('upWCDS').checked = true;
	getObj('upWCFS').checked = true;
	getObj('upWCLA').checked = false;
	getObj('upTCDS').checked = true;
	getObj('upTCLA').checked = true;
	getObj('upTCLN').checked = true;
}

function ShowLogon()
{
	Hide('LOADING');
	Show('LOGON');
	if (bRegistryValues)
		SetFocus('logon_password');
	else
		SetFocus('logon_username');

	ShowTip(this);
}

// ************************************************
// **********  Initialization Functions  **********
// ************************************************

var b_LOGON_SUBMITTED = 0;

function SubmitLogon()
{
	if (b_LOGON_SUBMITTED)
		return;
	if (IsValid(getObj("logon_username")))
	{
		// tells control not to use shorthand
		b_LOGON_SUBMITTED = 1;
		CallControlMethod('SetXMLShorthand', bUseObjectShorthand);
		getObj('logon_username').blur();
		getObj('logon_password').blur();
		sUsername = getObj('logon_username').value+'';
		sPassword = getObj('logon_password').value+'';
		var sEncryptedPass = CallControlMethod('EncryptString',sPassword);
		SetRegistryValues(sUsername, sEncryptedPass, getObj('logon_auto').checked);
		WaitCursor();
		DisplayLoggingOnDialog();
		CallControlMethod('Logon', sUsername, sEncryptedPass, false);
	}
	else
		Dialog(text('ERR/LOGN/VAL'),0);
	return true;
}

function doAfterWCRS_Logon () 
//Build the Collaborate Tab content area.
{
	BuildDiv('CB');		//Build the Collaborate Tab
	document.getElementById("utility").location = "/wapplink.asp?default";
	document.getElementById("Display").location = "WCRS_Office.asp";

}

function AutoLogon(aRegVals)
{
	DisplayLoggingOnDialog();
	CallControlMethod('Logon', aRegVals[0], aRegVals[1], false);
}

function DisplayLoggingOnDialog()
{
	Hide('LOGON');
	getObj('LOADING').innerHTML = "<img src='img/HourGlass.gif' style='vertical-align:middle'>"+ text('LOGN/MSG');
	Show('LOADING');
}

function ResetAutoLogon()
{
	var cVals = GetRegistryValues();
	SetRegistryValues(cVals[0], '', cVals[2]);
}

// ****************************************************
// *******************  LOGON STATUS  *****************
// ****************************************************

var bt_SESSION_STATUS = 0;

// BITWISE DEFINITIONS
var _RECEIVED_USER_INFO	= 1;
var _RECEIVED_DEVICE_LIST = 2;
var _RECEIVED_NODE_LIST = 4;
var _RECEIVED_FEATURE_CODES = 8;
var _NODE_DOWN = 32;
var _CONTACTS_RECEIVED = 34;
var _ACCOUNTS_REQUESTED = 128;
var _ACCOUNTS_RECEIVED = 256;
var _AB_ENABLED = 512;

function CheckLogonStatus()
{
	if ( (bt_SESSION_STATUS & _RECEIVED_USER_INFO		) &&
		 (bt_SESSION_STATUS & _RECEIVED_DEVICE_LIST		) &&
		 (bt_SESSION_STATUS & _RECEIVED_NODE_LIST		) &&
		 (bt_SESSION_STATUS & _RECEIVED_FEATURE_CODES	) &&
		 (bt_SESSION_STATUS & _AB_ENABLED				) &&
		  !b_LOGGED_ON &&
		  !b_CREATING_NEW_ACCOUNT )
	{
		b_LOGGED_ON = true;
		DisplayInterface();
		if (b_DEBUG_MODE)
			DebugTestFunction();
	}
}

function CheckStatus(nBitNum)
{
	return (bt_SESSION_STATUS & nBitNum)
}

function CheckLogon()
{
	alert("_RECEIVED_USER_INFO\t\t"+	(bt_SESSION_STATUS & _RECEIVED_USER_INFO)+
		"\t\n_RECEIVED_DEVICE_LIST\t\t"+(bt_SESSION_STATUS & _RECEIVED_DEVICE_LIST)+
		"\t\n_RECEIVED_FEATURE_CODES\t"+(bt_SESSION_STATUS & _RECEIVED_FEATURE_CODES)+
		"\t\n_RECEIVED_NODE_LIST\t\t"+	(bt_SESSION_STATUS & _RECEIVED_NODE_LIST)+
		"\t\n_AB_ENABLED\t\t"+			(bt_SESSION_STATUS & _AB_ENABLED)+
		"\n b_LOGGED_ON\t\t\t"+			 b_LOGGED_ON);
}

function DisplayInterface()
{
	//getObj('DV').firstChild.nextSibling.style.backgroundColor='#CCC';
	Show('TA');
	Show('CL');
	Hide('LOGON');
	Hide('LOADING');
	
	table['DV'].refresh();
	
	var oTenantGroup = GetTemplate('TENANT_GROUP');
	CallControlMethod('GetObjectList', oTenantGroup);
	
	DisplayAccountStatus();
	CheckForcedPasswordChange();
	GetClientCookieDisplayPreferences();
	UpdateAllContactDisplays();
	AutoCursor();
	getObj('UI').style.display = '';
	SetInitialView();
	ShowTooltip();
	CheckSynchAddressBookReminder();
	//this function will launch the wizard to set the current location of the statuses created by the server.
	CheckForCreateByServer();
}

function SetInitialView()
{
	var location_params = ToUpper(document.location.search).replace('?','');
	var aArgs = location_params.split('&'), i=0, loc_view, loc_num, loc_search;
	// multiple parameters
	while (aArgs[i])
	{
		var aPairs = aArgs[i].split('=');
		switch (aPairs[0])
		{
			case 'V': loc_view		= aPairs[1]; break;
			case 'N': loc_num		= aPairs[1]; break;
			case 'S': loc_search	= aPairs[1]; break;
		}
		i++;
	}
	if (loc_view)
	{
		if (loc_view=='CL' || loc_view=='TA')
		{
			if (loc_view=='CL' && loc_num)
			{
				getObj('cc_place_call_number').value = loc_num;
				getObj('cc_place_call_number').nextSibling.click();
				// prevent the DV feature codes edit hook below from being true
				loc_num = null;
			}
			else if (loc_view=='TA')
			{
				if (loc_search)
				{
					getObj('cc_type_ahead_search').value = loc_search;
					HandleTypeAheadKeydown();
				}
				else
					SetFocus('cc_type_ahead_search');
			}
		}
		else 
		{
			sCurDiv = loc_view;
			if (loc_view=='DS' && loc_search)
			{
				getObj('SearchSourceName').value = loc_search;
				CheckLocalSearchOptions();
				Search();
			}
		}
	}
	
	getObj('vl_'+sCurDiv).click();
	//if(sCurDiv=='CT') SetButtons('CTAB', "");
	// post UI setting configuration
	if (sCurDiv=='PI' && loc_num)
	{
		tab['PI'].head.children[4].click();	
		getObj('rowDV'+ loc_num).lastChild.lastChild.firstChild.click();
	}
}

var xTestObjs, nCurFile;

function DebugTestFunction()
{
	return;
	xTestObjs = new ActiveXObject("Msxml.DOMDocument");
	xTestObjs.onreadystatechange = CheckTestXML;
	nCurFile=5;
	LoadTestXMLFiles();
}

function LoadTestXMLFiles()
{
	var sFileName;
	switch (nCurFile)
	{
		case 0:
		sFileName = 'test_calllogs.xml';
		break;
		
		default:
		sFileName=null;
	}
	if (sFileName)
		xTestObjs.load(sFileName);
		
}

function CheckTestXML()
{
	if (xTestObjs.readyState==4 && xTestObjs.xml)
	{
		if (nCurFile!=4)
			XMLObjectListBlock(xTestObjs.firstChild.nodeName, xTestObjs);
		else
		{
			var child = xTestObjs.documentElement.firstChild;
			while (child)
			{
				oCallLogNode.appendChild(child.cloneNode(true));
				child=child.nextSibling;
			}
			table['CG'].refresh();
		}
		nCurFile++;
		LoadTestXMLFiles();
	}
}

// ****************************************************
// **********************  NEW  XML *******************
// ****************************************************

function CallControlMethod(method, p1, p2, p3, p4)
{
	if (bControlLoaded)
		return getObj('WebController').ExecuteCommand(method, p1, p2, p3, p4);
}

var bControlLoaded = false;

function OnControlActive()
{
	bControlLoaded = true;
}

function AddXMLObject(oXMLDoc)
{
	var oObj = oXMLDoc.firstChild;
	var aChildNodes = oXMLDoc.selectNodes(oObj.nodeName);
	switch (oObj.nodeName)
	{
		case 'ACCOUNT':
			SetAccountInfo(aChildNodes[0].cloneNode(true));
			break;
		
		case 'ACC_STATUS':
			UpdateStatusListItem(oObj.cloneNode(true));
			break;
			
		case 'CALL':
		case 'CONFERENCE_CALL':
			AddChildNodes(oCallListNode, aChildNodes);
			DisplayCallNotification(aChildNodes[0]);
			table['CL'].refresh();
			if (aChildNodes[0].nodeName=='CALL' && aChildNodes[0].selectSingleNode('State').text=='C' && aChildNodes[0].selectSingleNode('OtherPartyContactUniqueID').text && GetAccountFlag('PromptToAddIdentifiedCaller'))
				AddNumberToContact('CL', aChildNodes[0].selectSingleNode('CallID').text);
			break;
			
		case 'CALLLOG':
			AddChildNodes(oCallLogNode, aChildNodes);
			table['CG'].refresh();
			break;

		case 'CONTACT':
			AddChildNodes(oABNode, aChildNodes);
			if (!b_CREATING_NEW_ACCOUNT)
			{
				if (!b_ADDING_MULTIPLE_CONTACTS && !oCurSynchNode)
				{
					if (aChildNodes[0].selectSingleNode('Groups/LIST/*/STR[0]'))
						UpdateAllContactDisplays();
					else
						UpdateAddressBookLists();
				}
			}
			break;
			
		case 'COMPOSITE_STATUS':
			AddChildNodes(oCompStatusNode, aChildNodes);
			CheckForCreateByServer();
			DisplayAccountStatus();
			table['CS'].refresh();
			break;

		case 'DEVICE':
			if (!oDevNode.selectSingleNode('DEVICE[Extension="'+ oObj.selectSingleNode('Extension').text +'"]'))
			{
				var oStatus = oObj.selectSingleNode('DeviceStatus/DEVICE_STATUS');
				AddNodeColonExtension(oStatus);
				AddChildNodes(oDevNode, aChildNodes);
				// if the account owns this device
				if (aChildNodes[0].selectSingleNode('OwnerAccount').text == oActNode.selectSingleNode('.//UniqueID').text)
				{
					GetNodeInfo();
					table['DV'].refresh();
					HideCompositeStatusForm();
				}
				UpdateStatusListItem(oStatus.cloneNode(true));
			}
			break;
			
		case 'DEVICE_STATUS':
			AddNodeColonExtension(oObj);
			UpdateStatusListItem(oObj.cloneNode(true));
			break;
			
		case 'DIRECTORY':
			AddChildNodes(oDirNode, aChildNodes);
			table['DSFM'].refresh();
			break;
			
		case 'GREETING':
			var oGreetingInProgress = oGreetingsNode.selectSingleNode('GREETING[Description="'+aChildNodes[0].selectSingleNode('Description').text+'"]');
			if (oGreetingInProgress)
				oGreetingsNode.removeChild(oGreetingInProgress);
			AddChildNodes(oGreetingsNode, aChildNodes);
			table['GT'].refresh();
			UpdateGreetingsSelect();
			break;
		
		case 'GROUP':
			AddChildNodes(oGroupsNode, aChildNodes);
			table['GPLS'].refresh();
			MakeTableFilterSelect('AB', getObj('ab_filter_select'));
			break;
			
		case 'LANG_SETTINGS':
			CheckInternationalSettingsObject(aChildNodes[0]);
			break;
			
		case 'LICENSE_STATUS':
			AddChildNodes(oRoot, aChildNodes);
			HidePassportIfMargaritaNotLicensed();
			break;
		
		case 'MESSAGE':
			Dialog(aChildNodes[0].selectSingleNode('Message').text, 0);
			break;
			
		case 'MSG_WAITING':
			AddChildNodes(oMsgNode, aChildNodes);
			table['MS'].refresh();
			break;
			
		case 'NODE':
			// prevent duplicate nodes
			var oChild = oNodesNode.selectSingleNode(Insert(aChildNodes[0].selectSingleNode('NodeNameElements//NodeID').text, 'NODE[NodeNameElements//NodeID="{0}"]'));
			if (oChild)
				oNodesNode.removeChild(oChild);
			AddChildNodes(oNodesNode, aChildNodes);
			break;
			
		case 'PASSPORT':
			/*AddChildNodes(oPassNode, aChildNodes);
			BuildDiv('PP', oPassNode);*/
			break;
			
		case 'RULE':
			AddChildNodes(oRulesNode, aChildNodes);
			SetStepDisplayAttributes(aChildNodes[0]);
			table['RR'].refresh();
			break;
			
		case 'STEP':
			AddChildNodes(oStepsNode, aChildNodes);
			break;
			
		case 'SYSTEM_MESSAGE':
			if (IsTransientMessage(oObj))
				DisplayTransientMessage(oObj);
			else
			{
				AddChildNodes(oMsgNode, aChildNodes);
				MessageNotification(true);
				table['MS'].refresh('MS');
			}
			break;
			
		case 'TENANT_GROUP':
			AddChildNodes(oTenantGroupsNode, aChildNodes);
			break;		
	}
}

function UpdateXMLObject(oOldXMLDoc, oNewXMLDoc)
{
	var oOldObj=oOldXMLDoc.firstChild, oNewObj=oNewXMLDoc.firstChild;
	switch (oOldObj.nodeName)
	{
		case 'ACCOUNT':
			SetAccountInfo(oNewObj);
			break;
			
		case 'ACC_STATUS':
			// <ACC_STATUS><OwnerUniqueID>setz</OwnerUniqueID><OwnerTenantGroup>0</OwnerTenantGroup><Status>0</Status></ACC_STATUS>
			// update account
			if (oActNode.selectSingleNode('.//UniqueID').text == oOldObj.selectSingleNode('OwnerUniqueID').text)
			{
				var oActStatusNode = oActNode.selectSingleNode('.//AccountStatus');
				var b_UPDATE_CS_SELECT = !NodeValuesAreEqual(oNewObj, oActStatusNode.firstChild, new Array('CurrentCompositeStatus', 'CurrentDynamicStatus'));
				oActStatusNode.replaceChild(oNewObj.cloneNode(true), oActStatusNode.firstChild);
				if (b_UPDATE_CS_SELECT)
					DisplayAccountStatus();
			}
			UpdateStatusListItem(oNewObj.cloneNode(true));
			break;
			
		case 'CALL':
		case 'CONFERENCE_CALL':
			var oCallToUpdate = oCallListNode.selectSingleNode('*[NodeID="'+oOldObj.selectSingleNode('NodeID').text+'" and Extension="'+oOldObj.selectSingleNode('Extension').text+'" and CallID="'+oOldObj.selectSingleNode('CallID').text+'"]');
			if (oCallToUpdate) {			
				if (oCallToUpdate.selectSingleNode('State').text == 'A' && oNewObj.selectSingleNode('State').text != 'A')
					ResetNotification();
				CopyAttributes(oCallToUpdate, oNewObj);
				oCallListNode.replaceChild(oNewObj.cloneNode(true), oCallToUpdate);
				if (CallRequiresDisplayUpdate(oNewObj, oCallToUpdate))
				{
					//var old_Unique_ID = oCallToUpdate.selectSingleNode('NodeID').text + oCallToUpdate.selectSingleNode('Extension').text + oCallToUpdate.selectSingleNode('CallID').text
					//UpdateSingleTableRow('CL', oNewObj, old_Unique_ID, oCallToUpdate);
					UpdateSingleTableRow('CL', oNewObj, null, oCallToUpdate);
					ConfigureCallListButtons();
					if (oNewObj.nodeName=='CALL' && oNewObj.selectSingleNode('State').text=='C' && oNewObj.selectSingleNode('OtherPartyContactUniqueID').text && GetAccountFlag('PromptToAddIdentifiedCaller'))
						AddNumberToContact('CL', oNewObj.selectSingleNode('CallID').text);
				}
			}
			break;
			
		case 'CALLLOG':
			var oCallLogToUpdate = oCallLogNode.selectSingleNode('CALLLOG[CallID="'+oOldObj.selectSingleNode('CallID').text+'"]');
			if (oCallLogToUpdate) {
				oCallLogNode.replaceChild(oNewObj, oCallLogToUpdate);
				table['CG'].refresh();
			}
			break;
			
		case 'CONTACT':
			var old_unique_id = oOldObj.selectSingleNode('UniqueID').text;
			var oObj = oABNode.selectSingleNode('CONTACT[UniqueID="'+old_unique_id+'"]');
			if (oObj) {
				oABNode.replaceChild(oNewObj.cloneNode(true), oObj);
				if (!b_ADDING_MULTIPLE_CONTACTS && !oCurSynchNode)
					UpdateObjectDisplay('AB', oNewObj, true, old_unique_id);
				// update Groups list if the contact has been added or removed from a group
				if (oNewObj.selectSingleNode('Groups').text != oObj.selectSingleNode('Groups').text)
				{
					table['GPLS'].refresh();
					BuildDiv('UB', oSys);
				}
				// if a current rule is being created or edited, this update may be the result
				// of an add and the unique id hidden fields should be checked for update
				if (oCurRule)
				{
					var unique_id = oObj.selectSingleNode('UniqueID').text;
					if (oTARRWOobj && oTARRWOobj.selectSingleNode('UniqueID').text == unique_id)
						oTARRWOobj = oNewObj.cloneNode(true);
					if (oTARRWAobj && oTARRWAobj.selectSingleNode('UniqueID').text == unique_id)
						oTARRWAobj = oNewObj;
				}
				var link_type = oNewObj.selectSingleNode('LinkType').text;
				if (link_type)
				{
					var path = (link_type=='A') ? 'AccountStatus/ACC_STATUS' : 'DeviceStatus/DEVICE_STATUS';
					var oStatus = oNewObj.selectSingleNode(path).cloneNode(true);
					
					// make sure the status contains owner information
					// in some cases this may come down blank
					switch (link_type)
					{
						case 'A':
							if (!oStatus.selectSingleNode('OwnerUniqueID').text)
								oStatus.selectSingleNode('OwnerUniqueID').text = oNewObj.selectSingleNode('LinkParameter').text;
							break;
							
						case 'D':
							if (!oStatus.selectSingleNode('NodeID').text && !oStatus.selectSingleNode('Extension').text)
							{
								var params = oNewObj.selectSingleNode('LinkParameter').text.split(':');
								oStatus.selectSingleNode('NodeID').text 	= params[0];
								oStatus.selectSingleNode('Extension').text 	= params[1];
							}
							if (!oStatus.selectSingleNode('NodeColonExtension'))
								AddNodeColonExtension(oStatus);
							break;
					}

					UpdateStatusListItem(oStatus);
				}
			}
			break;
		
		case 'COMPOSITE_STATUS':
			var oCurObj = oCompStatusNode.selectSingleNode('COMPOSITE_STATUS[Description = "'+oOldObj.selectSingleNode("Description").text+'"]')
			if (oCurObj) {
				oCompStatusNode.replaceChild(oNewObj, oCurObj);
				if (oNewObj.selectSingleNode('Description').text != oCurObj.selectSingleNode('Description').text || 
					oNewObj.selectSingleNode('LocationNumber').text != oCurObj.selectSingleNode('LocationNumber').text)
					DisplayAccountStatus();
				table['CS'].refresh();
			}
			break;
		
		case 'DEVICE': 
			var oObj = oDevNode.selectSingleNode("DEVICE[NodeID='"+ oOldObj.selectSingleNode('NodeID').text +"' and Extension='"+ oOldObj.selectSingleNode('Extension').text +"']"); //
			
			var oStatus = oNewObj.selectSingleNode('DeviceStatus/DEVICE_STATUS');
			AddNodeColonExtension(oStatus);
			
			if (oObj)
				oDevNode.replaceChild(oNewObj.cloneNode(true), oObj);
				
			var oDeviceTableRow = getObj('rowDV'+oNewObj.selectSingleNode('Extension').text);

			if (oNewObj.selectSingleNode('OwnerAccount').text == oActNode.selectSingleNode('.//UniqueID').text)
			{
				if (!oObj)
					AddChildNodes(oDevNode, new Array(oNewObj.cloneNode(true)));
					
				if (!b_CREATING_NEW_ACCOUNT && oDeviceTableRow)
				{
					UpdateDeviceInterface(oNewObj);
					// refresh the feature code view if the station type changes
					if (!NodeValuesAreEqual(oNewObj, oObj, new Array('StationType')))
					{
						// if the feature code table is displayed for this device
						if (getObj('dv_feature_codes').style.display == '' &&
							getObj('dv_feature_codes').Extension == oNewObj.selectSingleNode('Extension').text)
						{
							UpdateFeatureCodeDisplay(boolVal(oNewObj.selectSingleNode('PBXAdmin')));
						}
						// if the favorites list window is open
						if (oFloatWin && !oFloatWin.closed)
							ShowFloater('FeatureCodeFavorites');
					}
				}
				else
				{
					GetNodeInfo();
					table['DV'].refresh();
				}
				DisplayAccountStatus();
				HideCompositeStatusForm();
			}
			// if the device was unassociated from the user's account
			else if (oDeviceTableRow)
			{
				oDeviceTableRow.outerHTML = '';
				// if this device has the feature codes for it displayed, 
				// clear the info, close the feature codes and refresh the devices table.
				if ((getObj('dv_feature_codes').Node == oOldObj.selectSingleNode('NodeID').text) &&
					(getObj('dv_feature_codes').Extension == oOldObj.selectSingleNode('Extension').text) &&
					(getObj('dv_feature_codes').style.display==''))
				{
					getObj('dv_feature_codes').Node = '';
					getObj('dv_feature_codes').Extension = '';
					//getObj('dv_feature_codes').DeviceType = '';
					Hide('dv_feature_codes');
					table['DV'].body.style.height = '';
					table['DV'].refresh();
				}
				// remove messages from the table, if the device is unassociated
				// or moved to another node, the server won't send deletes for these messages.
				var a_Msgs = oMsgNode.selectNodes('MSG_WAITING[NodeID="'+ oNewObj.selectSingleNode('NodeID').text +'" and Extension="'+ oNewObj.selectSingleNode('Extension').text +'"]'), i=0;
				while (a_Msgs[i])
					oMsgNode.removeChild(a_Msgs[i++]);
				table['MS'].refresh();
			}
				
			if (oCallListNode.hasChildNodes())
				table['CL'].refresh();
			
			UpdateStatusListItem(oStatus.cloneNode(true));
			break;
			
		case 'DEVICE_STATUS':
			AddNodeColonExtension(oNewObj);
			// update account devices
			var aDVobjs = oDevNode.selectNodes("DEVICE[NodeID ='"+ oOldObj.selectSingleNode('NodeID').text +"' and Extension='"+ oOldObj.selectSingleNode('Extension').text +"']"), i=0;
			while (aDVobjs[i])
			{
				var oDeviceStatusNode = aDVobjs[i].selectSingleNode('DeviceStatus');
				oDeviceStatusNode.replaceChild(oNewObj.cloneNode(true), oDeviceStatusNode.firstChild);
				//<DEVICE_STATUS><NodeID>1</NodeID><Extension>1008</Extension><PrimaryMessage></PrimaryMessage><SecondaryMessage></SecondaryMessage><Status>1</Status><OnACall>TRUE</OnACall></DEVICE_STATUS>
				if (!NodeValuesAreEqual(oNewObj, aDVobjs[i], new Array('PrimaryMessage', 'SecondaryMessage')))
					UpdateDeviceInterface(aDVobjs[i]);
				i++;
			}
			UpdateStatusListItem(oNewObj.cloneNode(true));
			break;
			
		case 'DIRECTORY':
			var oChild = oDirNode.selectSingleNode('DIRECTORY[DN="'+ oOldObj.selectSingleNode('DN').text +'"]');
			if (oChild) {
				oDirNode.replaceChild(oNewObj, oChild);
				table['DSFM'].refresh();
			}
			break;
		
		case 'FORWARDING':
			var oDevice = oDevNode.selectSingleNode("DEVICE[Extension='"+ oOldObj.selectSingleNode('Extension').text +"']");
			if (oDevice && (oDevice.selectSingleNode("*/FORWARDING").xml != oNewObj.xml))
			{
				var oFWDSettings = oDevice.selectSingleNode("ForwardingSettings");
				oFWDSettings.replaceChild(oNewObj, oFWDSettings.firstChild);
				UpdateDeviceInterface(oDevice);
			}
			break;
		
		case 'GREETING':
			var oChild = oGreetingsNode.selectSingleNode('GREETING[UniqueID="'+ oOldObj.selectSingleNode('UniqueID').text +'"]');
			if (oChild) {
				oGreetingsNode.replaceChild(oNewObj, oChild);
				table['GT'].refresh();
				UpdateGreetingsSelect();
			}
			break;
		
		case 'GROUP':
			var oGObj = oGroupsNode.selectSingleNode('GROUP[Name="'+ oOldObj.selectSingleNode('Name').text +'"]');
			if (oGObj) {
				oNewObj.setAttribute('open', oGObj.getAttribute('open'));
				oGroupsNode.replaceChild(oNewObj, oGObj);
				table['GPLS'].refresh();
				MakeTableFilterSelect('AB', getObj('ab_filter_select'));
			}
			break;
			
		case 'LICENSE_STATUS':
			var oChild = oRoot.selectSingleNode('LICENSE_STATUS');
			if (oChild)
				oRoot.replaceChild(oNewObj.cloneNode(true), oChild);
			break;
		
		case 'MSG_WAITING':
			UpdateMessageWaitingObject(oNewObj);
			break;
			
		case 'NODE':
			var oChild = oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID="'+ oOldObj.selectSingleNode('NodeNameElements//NodeID').text +'"]');
			if (oChild) {
				var oFeatureCodes = oChild.selectSingleNode('FeatureCodes');
				if (oFeatureCodes)
					oNewObj.appendChild(oFeatureCodes);
				oNodesNode.replaceChild(oNewObj.cloneNode(true), oChild);
				UpdateStatusListItemsForNode(oNewObj.cloneNode(true));
			}
			else
				oNodesNode.appendChild(oNewObj.cloneNode(true));
			break;
			
		case 'NODE_NAME':
			var oNode = oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID="'+ oOldObj.selectSingleNode('NodeID').text +'"]');
			var oChild = oNode.selectSingleNode('NodeNameElements/NODE_NAME');
			if (oChild) {
				oNode.selectSingleNode('NodeNameElements').replaceChild(oNewObj, oChild);
			}
			break;
		
		case 'PASSPORT':
			/*var oChild = oPassNode.selectSingleNode('PASSPORT[ID="'+ oOldObj.selectSingleNode('ID').text +'"]');
			if (oChild) {
				oChild = oPassNode.replaceChild(oNewObj.cloneNode(true), oChild);
				if (!NodeValuesAreEqual(oNewObj, oChild, new Array('ID', 'Password', 'AutoLogin')))
					BuildDiv('PP', oPassNode);
			}*/
			break;
			
		case 'RULE':
			var oChild = oRulesNode.selectSingleNode('RULE[UniqueID="'+ oOldObj.selectSingleNode('UniqueID').text +'"]');
			if (oChild) {
				if (oChild.getAttribute('awaitingStep'))
				{
					CopyAttributes(oChild, oNewObj);
					if (oNewObj.selectSingleNode('Steps').text != oChild.selectSingleNode('Steps').text)
					{
						var oldObj = oNewObj.cloneNode(true);
						oNewObj.selectSingleNode('Steps').text = oChild.selectSingleNode('Steps').text;
						oNewObj.removeAttribute('awaitingStep');
						CallControlMethod('EditXMLObject', oldObj, oNewObj);
					}
				}
				SetStepDisplayAttributes(oNewObj);
				oRulesNode.replaceChild(oNewObj, oChild);
				if (oCurRule && (oChild.selectSingleNode('UniqueID').text == oCurRule.selectSingleNode('UniqueID').text))
					oCurRule = oRulesNode.selectSingleNode('RULE[UniqueID="'+oNewObj.selectSingleNode('UniqueID').text+'"]')
	
				table['RR'].refresh();
			}
			break;
			
		case 'STEP':
			var oChild = oStepsNode.selectSingleNode('STEP[UniqueID="'+ oOldObj.selectSingleNode('UniqueID').text +'"]');
			if (oChild) {
				GetStepTargetObject(oNewObj);
				var old_unique_id = oChild.selectSingleNode('UniqueID').text;
				oStepsNode.replaceChild(oNewObj, oChild);
				if (oCurRule)
					AssociateStepWithCurrentRule(oNewObj);
				else if (oRulesNode.selectSingleNode('RULE[@awaitingStep="true"]'))
					AppendStepToWaitingRule(oNewObj);
				else
				{
					var oRule = FindOwningRule(oNewObj.selectSingleNode('UniqueID').text);
					if (!oRule)
					{
						// on a slow server the user may save the rule before this
						// step has returned therefore oCurRule no longer exists
						// and the rule contains the creation timestamp of the old step
						// in it's step list.  try to find the old unique id in the rule
						// and update the step list for the rule
						oRule = FindOwningRule(old_unique_id);
						if (oRule)
						{
							var re = new RegExp('([^0-9]+)('+ old_unique_id +')([^0-9]*)');
							var step_list = oRule.selectSingleNode('Steps').text;
							step_list = step_list.replace(re, '$1'+oNewObj.selectSingleNode('UniqueID').text+'$3');
							oRule.selectSingleNode('Steps').text = step_list;
							oRule.setAttribute('awaitingStep', 'true')
						}
					}
					if (oRule)
						SetStepDisplayAttributes(oRule);
				}
				
				UpdateRoutingRuleTables();
				if(saveRule==1)
				{
					SaveRoutingRule();
				}
			}
			break;
			
		case 'SYSTEM_MESSAGE':
			var oChild = oMsgNode.selectSingleNode('SYSTEM_MESSAGE[UniqueID="'+ oOldObj.selectSingleNode('UniqueID').text +'"]');
			if (oChild) {
				AddSystemMessageTranslation(oNewObj);
				oMsgNode.replaceChild(oNewObj, oChild);
				table['MS'].refresh();
			}
			break;
			
		case 'TENANT_GROUP':
			oChild = oTenantGroupsNode.selectSingleNode('TENANT_GROUP[UniqueID="'+ oObj.selectSingleNode('UniqueID').text +'"]');
			if (oChild) {
				oTenantGroupsNode.replaceChild(oNewObj, oChild);
			}
			break;
	}
}

function DeleteXMLObject(oXMLDoc)
{
	var oObj = oXMLDoc.firstChild, oPar, oChild, sTableID;
	switch (oObj.nodeName)
	{		
		case 'ACC_STATUS':
			var oChild = oStatusListNode.selectSingleNode('ACC_STATUS[OwnerUniqueID = "'+ oOldObj.selectSingleNode('OwnerUniqueID').text +'"]');
			oPar = oStatusListNode;
			removeChild();
			break;
		
		case 'CALL':
		case 'CONFERENCE_CALL':
			oChild = oCallListNode.selectSingleNode('*[CallID="'+oObj.selectSingleNode('CallID').text+'" and NodeID="'+oObj.selectSingleNode('NodeID').text+'" and Extension="'+oObj.selectSingleNode('Extension').text+'"]');
			oPar = oCallListNode;
			removeChild();
			table['CL'].refresh();
			ResetCallListState();
			break;
		
		case 'CALLLOG':
			oChild = oCallLogNode.selectSingleNode('CALLLOG[UniqueID="'+oObj.selectSingleNode('UniqueID').text+'"]');
			oPar = oCallLogNode;
			var oRow = getObj('rowCG'+oObj.selectSingleNode('UniqueID').text);
			if (oRow)
				table['CG'].body.removeChild(oRow);
			removeChild();
			break;
		
		case 'CONTACT':
			var oChild = oABNode.selectSingleNode('CONTACT[UniqueID="'+oObj.selectSingleNode('UniqueID').text+'"]');
			oPar = oABNode;
			removeChild();
			RemoveContactFromInterface(oObj.selectSingleNode('UniqueID').text);
			if (oXMLFormObj && (oChild.selectSingleNode('UniqueID').text == oXMLFormObj.selectSingleNode('UniqueID').text))
				CancelEdit();
			break;
		
		case 'COMPOSITE_STATUS':
			oChild = oCompStatusNode.selectSingleNode('COMPOSITE_STATUS[Description = "'+oObj.selectSingleNode("Description").text+'"]')
			oPar = oCompStatusNode;
			removeChild();
			if (getObj('CSFM').UniqueID == oChild.selectSingleNode('DN').text)
				HideCompositeStatusForm();
			DisplayAccountStatus();
			table['CS'].refresh();
			break;
		
		case 'DEVICE':
			oChild = oDevNode.selectSingleNode("DEVICE[Extension="+ oObj.selectSingleNode("Extension").text +"]");
			oPar = oDevNode;
			removeChild();
			if (oObj.selectSingleNode('OwnerAccount').text == oActNode.selectSingleNode('.//UniqueID').text)
			{
				table['DV'].refresh();
				HideCompositeStatusForm();
			}
			else
			{	
				var node_colon_ext = oObj.selectSingleNode('NodeID').text +':'+ oObj.selectSingleNode('Extension').text;
				UpdateAllDisplaysForThisContact('[Devices//String="'+node_colon_ext+'"]');
			}
			break;
			
		case 'DEVICE_STATUS':
			oChild = oStatusListNode.selectSingleNode('DEVICE_STATUS[Extension = "'+oObj.selectSingleNode('Extension').text+'"]')
			oPar = oStatusListNode;
			removeChild();
			break;
			
		case 'DIRECTORY':
			oChild = oDirNode.selectSingleNode('DIRECTORY[Description = "'+oObj.selectSingleNode('Description').text+'"]')
			oPar = oDirNode;
			removeChild();
			table['DSFM'].refresh();
			break;
			
		case 'GREETING':
			oChild = oGreetingsNode.selectSingleNode('GREETING[UniqueID="'+ oObj.selectSingleNode('UniqueID').text +'"]');
			oPar = oGreetingsNode;
			removeChild();
			if (oChild && (oChild.selectSingleNode('UniqueID').text == getObj('GTFM').UniqueID))
				ToggleGreetingsForm();
			table['GT'].refresh();
			UpdateGreetingsSelect();
			break;
		
		case 'GROUP':
			oChild = oGroupsNode.selectSingleNode('GROUP[Name="'+ oObj.selectSingleNode('Name').text +'"]');
			oPar = oGroupsNode;
			removeChild();
			table['GPLS'].refresh();
			MakeTableFilterSelect('AB', getObj('ab_filter_select'));
			break;
			
		case 'PASSPORT':
			/*var oChild = oPassNode.selectSingleNode('PASSPORT[ID="'+ oObj.selectSingleNode('ID').text +'"]');
			oPar = oPassNode;
			removeChild();
			BuildDiv('PP', oPassNode);*/
			break;
			
		case 'RULE':
			oChild = oRulesNode.selectSingleNode('RULE[UniqueID="'+ oObj.selectSingleNode('UniqueID').text +'"]');
			oPar = oRulesNode;
			removeChild();
			if (oCurRule && oCurRule.selectSingleNode('UniqueID').text == oChild.selectSingleNode('UniqueID').text)
				CloseRoutingRule();
			table['RR'].refresh();
			break;
		
		case 'STEP':
			oChild = oStepsNode.selectSingleNode('STEP[UniqueID="'+ oObj.selectSingleNode('UniqueID').text +'"]');
			oPar = oStepsNode;
			removeChild();
			if (getObj('formRREDWA') && (getObj('formRREDWA').curStep = oChild.selectSingleNode('UniqueID').text))
			{
				ResetStepForm();
				if (oCurRule)
				{
					Hide('formRREDWA');
					Show('tableRREDWA');
					SetButtons('RREDWA');
				}
			}
			UpdateRoutingRuleTables();
			break;
			
		case 'SYSTEM_MESSAGE':
			oChild = oMsgNode.selectSingleNode('SYSTEM_MESSAGE[UniqueID="'+ oObj.selectSingleNode('UniqueID').text +'"]');
			oPar = oMsgNode;
			removeChild();
			table['MS'].refresh();
			if (!oMsgNode.hasChildNodes())
				MessageNotification(false);
			break;
			
		case 'TENANT_GROUP':
			oChild = oTenantGroupsNode.selectSingleNode('TENANT_GROUP[UniqueID="'+ oObj.selectSingleNode('UniqueID').text +'"]');
			oPar = oTenantGroupsNode;
			removeChild();
			break;
	}
	
	function removeChild()
	{
		if (oPar && oChild && (oChild.parentNode==oPar))
			oPar.removeChild(oChild);
	}
}


var nListCount = new Array;
var sTempDivBeforeActiveCall;
function XMLObjectListBlock(strObjectType, oXMLDoc)
{
	var aChildNodes, type = oXMLDoc.selectSingleNode('LIST/ObjectsType').text, x_path = 'LIST/*/'+type;
	if (strObjectType=='TIME_ZONE_INFO')
	{
		type = strObjectType;
		x_path = 'LIST/*/STR/String';
	}
	nListCount[type] = parseFloat(oXMLDoc.selectSingleNode('LIST/NumberOfObjects').text);
	aChildNodes = oXMLDoc.selectNodes(x_path);
	switch (type)
	{	
		case 'CALL':
		case 'CONFERENCE_CALL':
			if(sCurDiv!="AC")
				sTempDivBeforeActiveCall = sCurDiv;
			getObj('vl_AC').style.display = "";
			ToggleLink(this,"AC");
			AddChildNodes(oCallListNode, aChildNodes);
			table['CL'].refresh();
// 			Removing the functionality of the iExpPlus.gif/iExpMinus.gif (+/-) functionality from UC4.0 UI */
			if (getObj('CC').style.display == 'none' && oCallListNode.hasChildNodes())
			{
				//getObj('cc_call_control_toggle_icon').click();
				ToggleCallControl(1);
			}
			var active_call = oXMLDoc.selectSingleNode('LIST/*/CALL[State="C"]');
			if (active_call && active_call.selectSingleNode('OtherPartyContactUniqueID').text && GetAccountFlag('PromptToAddIdentifiedCaller'))
				AddNumberToContact('CL', active_call.selectSingleNode('CallID').text);
			break;
		
		case 'CALLLOG':
			AddChildNodes(oCallLogNode, aChildNodes);
			table['CG'].refresh();
			break;
		
		case 'CONTACT':
			AddChildNodes(oABNode, aChildNodes);
			bt_SESSION_STATUS |= _AB_ENABLED;
			// update expandable rules to include contact info
			if (oStepsNode.selectSingleNode('STEP[StepType="'+_STEPTYPE_SEND_TO_CONTACT+'"]'))
				table['RR'].refresh();
			break;
		
		case 'COMPOSITE_STATUS':
			AddChildNodes(oCompStatusNode, aChildNodes);
			table['CS'].refresh();
			break;
		
		case 'DEVICE':
			var nAccountDevices = oXMLDoc.selectNodes('LIST//DEVICE[OwnerAccount="'+oActNode.selectSingleNode('.//UniqueID').text+'"]').length;
			AddChildNodes(oDevNode, aChildNodes);
			
			bt_SESSION_STATUS |= _RECEIVED_DEVICE_LIST;
			if (nAccountDevices)
			{
				GetNodeInfo();
				table['CS'].refresh();
			}
			else
			{
				if (!nAccountDevices && nListCount[type] == 0)
					SetReceivedNodeInfo();
					
				if (nListCount[type] != 0)
				{
					var j=0;
					while (aChildNodes[j])
					{
						var node_colon_ext = aChildNodes[j].selectSingleNode('NodeID').text +':'+ aChildNodes[j++].selectSingleNode('Extension').text
						var aABobjs = oABNode.selectNodes('CONTACT[Devices//String="'+node_colon_ext+'"]'), i=0;
						while(aABobjs[i])
							UpdateObjectDisplay('AB', aABobjs[i++]);
					}
				}
			}
			break;
		
		case 'DIRECTORY':
			AddChildNodes(oDirNode, aChildNodes);
			table['DSFM'].refresh();
			tab['DS'] = new TabObject('DS', getObj('tabsDS'));
			tab['DS'].refresh();
			break;	
			
		case 'FEATURE_CODE':
			if (aChildNodes[0])
			{
				var oFCNode = oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID='+aChildNodes[0].selectSingleNode('NodeID').text+']/FeatureCodes');
				if (!oFCNode)	
					oFCNode = AddNode(oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID='+aChildNodes[0].selectSingleNode('NodeID').text+']'), 'FeatureCodes');
				if (oFCNode && aChildNodes.length)
				{
					if (oFCNode.hasChildNodes())
						RemoveChildNodes(oFCNode);
					AddChildNodes(oFCNode, aChildNodes);
					var oCurRequestedNode = oLogonNode.selectSingleNode('RequestedNodes/Node[@id='+aChildNodes[0].selectSingleNode('NodeID').text+']');
					if (oCurRequestedNode)
						oCurRequestedNode.setAttribute('featureCodes', 'true');
				}
			}
			GetNodeInfo();
			break;
		
		case 'GREETING':
			AddChildNodes(oGreetingsNode, aChildNodes);
			table['GT'].refresh();
			if (oStepsNode.selectSingleNode('STEP[StepType="'+_STEPTYPE_PLAY_GREETING+'"]'))
				table['RR'].refresh();
			break;

		case 'GROUP':
			AddChildNodes(oGroupsNode, aChildNodes);
			table['GPLS'].refresh();
			MakeTableFilterSelect('AB', getObj('ab_filter_select'));
			break;
		
		case 'MESSAGE':
		case 'MSG_WAITING':
		case 'SYSTEM_MESSAGE':
			AddChildNodes(oMsgNode, aChildNodes);
			table['MS'].refresh();
			MessageNotification(true);
			break;
		
		case 'PASSPORT':
			/*AddChildNodes(oPassNode, aChildNodes);
			if (oPassNode.childNodes.length >= nListCount[type])
				BuildDiv('PP', oPassNode);*/
			break;
		
		case 'RULE':
			AddChildNodes(oRulesNode, aChildNodes);
			table['RR'].refresh();
			break;
			
		case 'STEP':
			AddChildNodes(oStepsNode, aChildNodes);
			var child = oStepsNode.firstChild;
			while (child)
			{
				GetStepTargetObject(child);
				child=child.nextSibling;
			}
			SetStepDisplayAttributesForAllRules();
			table['RR'].refresh();
			break;
			
		case 'TENANT_GROUP':
			AddChildNodes(oTenantGroupsNode, aChildNodes);
			break;
			
		case 'TIME_ZONE_INFO':
			AddChildNodes(oTimeZonesNode, aChildNodes);
			SortTimeZoneInfoList();
			break;
	}
}

var b_MULT_TENANT_GROUPS_PRESENT = 0;
//var n_LOGIN_ATTEMPTS = 0; removed counter functionality
var b_PREVENT_LOGOFF = 0;

function test()
{
	CallControlMethod('test');
}

function NotifyLinkedError(sReason, sParameters, sLinkedObjects, sMethod, oOldObj, oNewObj, oThirdObj, oFourthObj)
{
	return NotifyError(sReason, sParameters, sMethod, oOldObj, oNewObj, oThirdObj, oFourthObj);
}

function NotifyError(sReason, sParameters, sMethod, oOldObj, oNewObj, oThirdObj, oFourthObj)
{	
	CallControlMethod('Diag', '### in NotifyError ###');
	var sErrorMsg = getErrorString(sReason, "Long", sParameters);
	CallControlMethod('Diag', '### in NotifyError - converted error string ###');
	var oNewXMLDoc = new ActiveXObject("Msxml.DOMDocument");
	var oOldXMLDoc = new ActiveXObject("Msxml.DOMDocument");

	switch (sMethod)
	{
		case 'AddXMLObject':
			switch (oOldObj.nodeName)
			{				
				case 'DEVICE':
					if (b_CREATING_NEW_ACCOUNT)
					{
						var oContact = oSearchNode.selectSingleNode('NA/CONTACT[not(@failed) and WorkNumber1="'+oOldObj.selectSingleNode('Extension').text+'"]');
						if (oContact)
						{
							oContact.setAttribute('failed', 'true');
							Dialog(sErrorMsg,0);
						}
						CheckForNewAccountDevices();
						return;
					}
					else
					{
						ToggleDeviceForm(1);
						getObj('add_device_name').value = oOldObj.selectSingleNode('Name').text;
						getObj('add_device_ext').value = oOldObj.selectSingleNode('Extension').text;
						getObj('add_device_pass').focus();
					}
					break;
					
				default:
					oOldXMLDoc.appendChild(oOldObj);
					DeleteXMLObject(oOldXMLDoc);
					break;
			}
			break;
			
		case 'CreateAccountSynch':
			if (sReason == '-CA-MT')
			{
				b_MULT_TENANT_GROUPS_PRESENT = 1;
				var err_vals = ParseDelimitedList(sParameters);
				var tenant_group_vals = ParseMultiValueList(err_vals[1]);

				// REMOVE THE DIALOG WINDOW FROM THE EQUATION
				var rows='<row><select size="1">{0}</select></row>', options='', i=0;
				while (tenant_group_vals[0][i])
				{
					var option='<option value="{0}">{1}</option>';
					var inserts = new Array(tenant_group_vals[1][i], tenant_group_vals[0][i].replace('&', '&#38;'));
					options += InsertMultiple(inserts, option);
					i++;
				}
				rows = Insert(options, rows);
				var dialog_return = Dialog(text('NA/TG'), 1, rows);
				var dialog_vals = ParseDelimitedList(dialog_return);
				if (eval(dialog_vals[0]))
				{
					var cas_return = CallControlMethod('CreateAccountSynch', getObj('na_username').value, CallControlMethod('EncryptString', getObj('na_password1').value), dialog_vals[1]);
					// retval will return 'undefined' in the case where a matching account is found - don't perform the search
					if (cas_return=='')
					{
						cur_search_type='NA';
						//b_NEW_ACCOUNT_DEVICE_SEARCH_IN_PROGRESS=1;
						CallControlMethod('Search', getObj('na_first_name').value+' '+getObj('na_middle_name').value, GetDeviceSearchCriteria());
						// we have to manually switch the view in this case, the function which normally advances the process
						// was stepped out of because this section needs catches the error and must advance the process
						aCurProcess[1]=2;
						Hide('NAUN');
						Show('NADV');
					}
				}
				return;
			}
			if (sReason == '-CA-AE')
			{
				Dialog(text('NA/AE'),0);
				aCurProcess[1]=2;
				GoPreviousNewAccountStep(false);
				return;
			}			
			break;
		
		case 'DeleteXMLObject':
			oOldXMLDoc.appendChild(oOldObj);
			AddXMLObject(oOldXMLDoc);
			break;
		
		case 'EditXMLObject':
			oNewXMLDoc.appendChild(oNewObj);
			oOldXMLDoc.appendChild(oOldObj);
			// pass in the old object as the new to restore the object to it's previous state
			UpdateXMLObject(oNewXMLDoc, oOldXMLDoc);
			break;
			
		case 'GetObjectSynch':
			if (oNewObj=='MASK_SERVER_ERROR_MSG')
				return;
			break;
		
		case 'Login':
		case 'Logon':
			// If a logon failure occurs, reset the auto-logon cookie
			b_LOGON_SUBMITTED = 0;
			// If the logon failed due to a user already logged in
			// with this account, prompt to force the user off.

			if (sReason == '-LF-LI')
			{
				var forceLogoff = Dialog(text('DLG/FORC'),1);
				if (eval(ParseDelimitedList(forceLogoff)[0]))
				{
					var aRegVals = GetRegistryValues();
					var username = (bAutoLogon) ? aRegVals[0] : getObj('logon_username').value;
					var password = (bAutoLogon) ? aRegVals[1] : CallControlMethod('EncryptString',getObj('logon_password').value);
					CallControlMethod('Logon', username, password, true);
					return;
				}
				else
					ShowLogon();
			}
			else
			{
				ResetAutoLogon();
				/*  ---Removed Login Attempts Counter to address tab vs window closure discrepancies
				if (sReason == '-LF-BP')
					n_LOGIN_ATTEMPTS++;
					
				if (n_LOGIN_ATTEMPTS == 3)
				{
					Dialog(text('LOGN/FAIL'),0);
					CallControlMethod('CloseBrowser');
				}	
				else
				{*/
					var result = Dialog(sErrorMsg,0);
					ShowLogon();
				//}
			}
			AutoCursor();
			return;
		
		case 'LoggedOff':
			if (b_PREVENT_LOGOFF)
				return;
			Dialog(sErrorMsg,0);
			CloseOut(true);
			return;
			
		case 'Search':
			if (sReason == '-SR-TM')
			{
				b_MAX_TYPE_AHEAD_EXCEEDED=1;
				var oCurSearchNode = oSearchNode.selectSingleNode(cur_search_type);
				if (oCurSearchNode.hasChildNodes())
					RemoveChildNodes(oCurSearchNode);
	
				if (cur_search_type=='TA')
				{
					//ConfigureCallControlDisplay();
					//if (getObj('CC').style.display=='none')
					//{
						//getObj('cc_call_control_toggle_icon').click();
					//HandleKeypressInterval();
					//}
					SetFocus('cc_type_ahead_search');
				}
				else
				    table[cur_search_type].refresh();
				//return;
			}
			break;
		
		default :
			if (sReason.indexOf('-CGRT')==0)
			{
				var description = ParseDelimitedList(ParseDelimitedList(sParameters)[0])[0]
				var oGreeting = oGreetingsNode.selectSingleNode('GREETING[Description="'+description+'"]');
				if (oGreeting)
					oGreetingsNode.removeChild(oGreeting);
				table['GT'].refresh();
				break;
			}
	}
	
	Dialog(sErrorMsg,0);
	
}

function CopyAttributes(oldObj, newObj)
{
	var aAttributes = oldObj.attributes, i=0;
	while (aAttributes[i])
		newObj.setAttribute(aAttributes[i].nodeName, aAttributes[i++].nodeValue);
}

function AddChildNodes(oCurNode, children)
{
	if (!children || !children.length)
		return;
	var i=0, bAddChild=1, type = children[0].nodeName;
	while (children[i])
	{
		var child = children[i].cloneNode(true);
		switch (type)
		{
			case 'CALL':
			case 'CONFERENCE_CALL':
				FlagCallFlow(child);
				break;
				
			case 'CONTACT':
				if (oCurNode.nodeName == 'AB')
				{
					var link_type = child.selectSingleNode('LinkType').text, status;
					switch (link_type)
					{
						case 'D':
							status = child.selectSingleNode('DeviceStatus/DEVICE_STATUS').cloneNode(true);
							var link_param = child.selectSingleNode('LinkParameter').text;
							var re = new RegExp(':[0-9]*');
							var node_id = link_param.replace(re, '');
							AddNodeColonExtension(status);
							GetSynchronousNode(node_id);
							break;
							
						case 'A':
							status = child.selectSingleNode('AccountStatus/ACC_STATUS').cloneNode(true);
							break;
					}
					if (status)
						UpdateStatusListItem(status);
				}
				break;
			
			case 'DEVICE':
				if (oDevNode.selectSingleNode('DEVICE[Extension="'+child.selectSingleNode('Extension').text+'"]'))
					bAddChild = 0;
				else
				{
					var oDeviceStatus = child.selectSingleNode('DeviceStatus/DEVICE_STATUS');
					AddNodeColonExtension(oDeviceStatus);
					UpdateStatusListItem(oDeviceStatus.cloneNode(true));
				}
				break;
			
			case 'GROUP':
				child.setAttribute('open', 'false');
				break;
			
			case 'NODE':
				if (!boolVal(child.selectSingleNode('.//Active')))
					UpdateStatusListItemsForNode(child.cloneNode(true));
				break;
				
			case 'STEP':
				//GetStepTargetObject(child);
				break;
				
			case 'SYSTEM_MESSAGE':
				AddSystemMessageTranslation(child);
				break;
			
			default:
				bAddChild = 1;
		}
		if (bAddChild && oCurNode && child)
			oCurNode.appendChild(child);
		i++;
	}
}

var bUseObjectShorthand = false;
var bt_ACCOUNT_STATUS;

/*function updateAccountDisplayAndNotifyChangesTOWCRS()
{
  if(IsWebInviteFlagSet() && IsWebInviteServiceAvailable())
  {
	//update the UC UI display if required
	if((oActNode.selectSingleNode('.//Emails/LIST/child0/STR/String') == null) || (oActNode.selectSingleNode('.//FirstName') == null) || (oActNode.selectSingleNode('.//LastName') == null) || (oActNode.selectSingleNode('.//WorkNumber1') == null) )
	{
		//then Collborate tab cannot be displayed
		getObj('vl_CB').style.display = "none";
		if(sCurDiv == "CB")
		{
			getObj('vl_CT').click();
		}
		Dialog(text('DLG/HIDE_COLLABORATE_TAB_COZ_EDIT'), 0);
	}
	else
		if(getObj('vl_CB').style.display != '')
			DisplayWebInviteIcon();
	
	//send the account Profile changes to WCRS for update in SQL

	logIntoWCRS(oActNode);
   }
}*/

var permission_revoked = 9;//initialized to 9 to indicate that this function is being called the first time(loading UC webclient first time)
var is_WCRSDisplayed = 0;
function DisplayWebInviteIcon()
{
	if (IsWebInviteFlagSet() && IsWebInviteServiceAvailable())
	{
		if(getObj('vl_CB').style.display != '')
		{
			//if you are here, that means you previously did not have collaborate tab 
			//either because the account info did not have the WCRS required fields or you were not permitted or the wcrs server was not running
			//But now the server is running and you are permitted. so trying to check all the required fields
			// if all account info is present then your collaborate tab will show up shortly.

			//Call Login functions for WCRS and load Office.asp
			if(permission_revoked == 9) is_WCRSDisplayed = logIntoWCRS(0);
			else if(permission_revoked == 1){is_WCRSDisplayed = logIntoWCRS(0);Dialog_Modeless(text('DLG/SHOW_COLLABORATE_TAB_PERMIT_GRANTED'), 0);}// this condition means that the permision to use WCRS was just granted to you. Show msg that you will auto login and if there is any field missing show that dialog as well
			else if(permission_revoked == 2){is_WCRSDisplayed = logIntoWCRS(0);Dialog_Modeless(text('DLG/SHOW_COLLABORATE_TAB_SERVER_UP'), 0);}// this condition means that the server went down previously and just came back up. Show msg that you will auto login and if there is any field missing show that dialog as well
			else is_WCRSDisplayed = logIntoWCRS(1); // this condition means that the user was previously itself permitted to use WCRS, but did not have the required information. Therefore the user would have got the dialog message stating the required field missing. Therefore there is no necessity for the user to see any more info about the missing fields. supress the dialog popup

			if(is_WCRSDisplayed != 0) 
			{//this means that all account info is available
				getObj('vl_CB').style.display = '';
				getObj('WI').style.display = '';
				getObj('ShowYWCRSIsNotDisplayed').style.display = "none";
				//getObj('Coll_Help').style.display = '';
			}
			else
			{//this means that some or the other required account info is missing
				//This need not be done because if vl_CB is not displayed, the WI also should not be displayed
				getObj('WI').style.display = "none";
				//getObj('Coll_Help').style.display = "none";
				getObj('ShowYWCRSIsNotDisplayed').style.display = '';
			}
			permission_revoked = 0;
		}
		else
		{
			//your collaborate tab was previously being displayed and
			//your account was just edited, so checking to see if all WCRS required fields are still present

			is_WCRSDisplayed = logIntoWCRS(0);

			if(is_WCRSDisplayed != 0) 
			{
				getObj('vl_CB').style.display = '';
				getObj('WI').style.display = '';
				getObj('ShowYWCRSIsNotDisplayed').style.display = "none";
				//getObj('Coll_Help').style.display = '';
			}
			else
			{
				getObj('vl_CB').style.display = "none";
				getObj('WI').style.display = "none";
				getObj('ShowYWCRSIsNotDisplayed').style.display = '';
				//getObj('Coll_Help').style.display = "none";
				if(sCurDiv == "CB")
				{
					getObj('vl_CT').click();
				}
//				Dialog_Modeless(text('DLG/HIDE_COLLABORATE_TAB_COZ_EDIT'), 0);
			}
		}
	}
	else
	{
		//either the WCRS server is down or you are not permitted to see WCRS related functions

		if(!IsWebInviteFlagSet())
		{
			//prompt the dialog box only when the user was previously viewing the Collborate tab	
			if(getObj('WI').style.display == '')
				Dialog_Modeless(text('DLG/HIDE_COLLABORATE_TAB_PERM_REVOKED'), 0);
			permission_revoked = 1;//permission revoked by admin
		}
		else 
		{
			if(getObj('WI').style.display == '')
				Dialog_Modeless(text('DLG/HIDE_COLLABORATE_TAB_SERVER_DOWN'), 0);
			permission_revoked = 2;//server went down
		}
		getObj('WI').style.display = "none";
		getObj('vl_CB').style.display = "none";
		getObj('ShowYWCRSIsNotDisplayed').style.display = "none";
		is_WCRSDisplayed = 0;
		//getObj('Coll_Help').style.display = "none";
		if(sCurDiv == "CB")
		{
			getObj('vl_CT').click();
		}
	}
	
	table['CL'].refresh();
}

var oXMLReq;
function proccessLogin()
{
   var szStatus;
   if ((oXMLReq.readyState == 4) && (oXMLReq.status == 200))
   {
	//replaced Javascript Alert calls with Dialog_Modeless calls   
	//Also hide the Collaborate features if there is an error
      szStatus = oXMLReq.responseText;
      switch(szStatus)
      {
         case "API_NOTAUCUSER":
            Dialog_Modeless("Collaboration Login Failed - Not a Unified Communicator User.",14);
            getObj('WI').style.display = "none";		//hide Collaborate
			getObj('vl_CB').style.display = "none";
            break;
         case "API_LOGINFAIL":
            Dialog_Modeless("Collaboration Login Failed - Invalid Account.",14);
            getObj('WI').style.display = "none";		//hide Collaborate
			getObj('vl_CB').style.display = "none";
            break;
         case "API_INVALIDEMAIL":
            Dialog_Modeless("Collaboration Login Failed - Email Address Already In Use.  <line_break/><line_break/>Please review your profile settings.",14);
            getObj('WI').style.display = "none";		//hide Collaborate
			getObj('vl_CB').style.display = "none";
            break;
         case "API_SUCCESS":
            doAfterWCRS_Logon();
            break;
         default:
            Dialog_Modeless("Collaboration Login Failed - General Error",14);
            getObj('WI').style.display = "none";		//hide Collaborate
			getObj('vl_CB').style.display = "none";
      }
   }
}

function logIntoWCRS(dont_show_popup_dialog)
{
//dont_show_popup_dialog is set to 1 when the Collaborate tab is not being displayed and the account is furthur edited such that 
//one more required field is deleted. In that case we should not popup saying again that the collaborate tab iis not displayed because of the required field missing
//THis info would have been displayed to the user either when they logged in first or when they deleted the first required field. No need to display the information from next time on.
     var oTempActNode = oActNode;
     var return_value = 1;
     var messageToDialog = space = '';
	//Get the user Name
	sUsername = oTempActNode.selectSingleNode('.//UniqueID').text;

	//Get the encrypted password
	sEncryptedPass = oTempActNode.selectSingleNode('./Password').text;

	//Get the email address
	if(oTempActNode.selectSingleNode('.//Emails/LIST/child0/STR/String'))
		szEmail = oTempActNode.selectSingleNode('.//Emails/LIST/child0/STR/String').text;
	else
	{ 
//		getObj('vl_CB').style.display = "none";
//		if(dont_show_popup_dialog != 1) 
//			Dialog_Modeless(text('DLG/NO_EMAIL'), 20); 
        messageToDialog = '\n'+ "Email Address¶";
		return_value = 0;
	}

	//Get the First Name
	if(oTempActNode.selectSingleNode('.//FirstName').text != '')
		szFName = oTempActNode.selectSingleNode('.//FirstName').text;
	else
	{
//		getObj('vl_CB').style.display = "none"; 
//		if(dont_show_popup_dialog != 1) 
//			Dialog_Modeless(text('DLG/NO_FNAME'), 20); 
		messageToDialog += '\n'+ "First Name¶";
		return_value = 0;
	}

	//Get the Last name
	if(oTempActNode.selectSingleNode('.//LastName').text != '')
		szLName = oTempActNode.selectSingleNode('.//LastName').text; 
	else
	{
//		getObj('vl_CB').style.display = "none"; 
//		if(dont_show_popup_dialog != 1) 
//			Dialog_Modeless(text('DLG/NO_LNAME'), 20);
		messageToDialog += '\n'+ "Last Name¶";
		return_value = 0;
	}

	//Get the Phone Number
	if(oTempActNode.selectSingleNode('.//WorkNumber1').text != '')
		szPhone = oTempActNode.selectSingleNode('.//WorkNumber1').text;
	else
	{ 
//		getObj('vl_CB').style.display = "none"; 
//		if(dont_show_popup_dialog != 1) 
//			Dialog_Modeless(text('DLG/NO_PHNUMBER'), 20); 
		messageToDialog += '\n'+ "Primary Work Number¶";
		return_value = 0;
	}

	//Get the TimeZone
	szTimeZone = getAccountTimeZone(oTempActNode, dont_show_popup_dialog);
	if(szTimeZone == 0) return_value = 0;

    if(return_value == 0 && dont_show_popup_dialog != 1)
	{
	    var message = "Please complete the following required fields in your account in order to gain access to collaboration features:¶¶";
	    Dialog_Modeless(message+messageToDialog,0);
	    return return_value;
    }
    else if(return_value == 0 && dont_show_popup_dialog == 1)
        return return_value;

   try
   {
      oXMLReq = new ActiveXObject("Msxml2.XMLHTTP");
   }
   catch(e)
   {
      try{oXMLReq = new ActiveXObject("Microsoft.XMLHTTP");}
      catch(e){oXMLReq = false;}
   }

   if (oXMLReq)
   { 
	var WCRS_API_Login_Page = "WCRS_Logon.asp?szUsername=" + sUsername + "&szPassword=" + sEncryptedPass + "&szEnc=true" + "&szEmail=" + szEmail + "&szFName=" + szFName + "&szLName=" + szLName + "&szPhone=" + szPhone + "&szTimeZone=" + szTimeZone;                     
      oXMLReq.onreadystatechange = proccessLogin;
      oXMLReq.open("GET", WCRS_API_Login_Page, true);
      oXMLReq.send("");
   }
   else
   {
        var WCRS_API_Login_Page = "WCRS_Logon_NoAjax.asp?szUsername=" + sUsername + "&szPassword=" + sEncryptedPass + "&szEnc=true" + "&szEmail=" + szEmail + "&szFName=" + szFName + "&szLName=" + szLName + "&szPhone=" + szPhone + "&szTimeZone=" + szTimeZone;                     
	var WCRS_IFrame_Params = "frameborder=0 marginwidth=0 marginheight=0 height=0 width=100%";
	var WCRS_IFrame = "<IFRAME name='WCRS_LoginFrame' src='" + WCRS_API_Login_Page + "' " + WCRS_IFrame_Params + "> " +"</IFRAME>";
	document.getElementById("WCRS_Login").innerHTML=WCRS_IFrame;	//add code to WCRS_IFrame
	//doAfterWCRS_Logon();
	setTimeout("doAfterWCRS_Logon()",0);	//delay necessary to allow WCRS Office.asp page to load properly.
    }
	return return_value;
}

function getAccountTimeZone(oTempActNode,dont_show_popup_dialog)
{	
	if(oTempActNode.selectSingleNode('TimeZone/TIME_ZONE_INFO/Display').text != '')
		var szTempTimeZone = oTempActNode.selectSingleNode('TimeZone/TIME_ZONE_INFO/Display').text;
	else
	{ 
		getObj('vl_CB').style.display = "none";
		if(dont_show_popup_dialog != 1)  
			Dialog_Modeless(text('DLG/NO_TZONE'), 20); 
		return 0;
	}

	switch(szTempTimeZone)
	{
		case "(GMT) Casablanca, Monrovia" : return "GMT"; break;
		case "(GMT) Greenwich Mean Time : Dublin, Edinburgh, Lisbon, London" : return "LONDON"; break;
		case "(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna" : return "BERLIN"; break;
		case "(GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague" : return "GMT+1"; break;
		case "(GMT+01:00) Brussels, Copenhagen, Madrid, Paris" : return "PARIS"; break;
		case "(GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb" : return "GMT+1";break;
		case "(GMT+01:00) Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb" : return "GMT+1"; break;
		case "(GMT+01:00) West Central Africa" : return "GMT+1"; break;
		case "(GMT+02:00) Athens, Beirut, Istanbul, Minsk" : return "GMT+2";break;
		case "(GMT+02:00) Athens, Istanbul, Minsk" : return "ATHENS"; break;
		case "(GMT+02:00) Bucharest" : return "GMT+2"; break;
		case "(GMT+02:00) Cairo" : return "EGPT"; break;
		case "(GMT+02:00) Harare, Pretoria" : return "GMT+2"; break;
		case "(GMT+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius" : return "GMT+2";break;
		case "(GMT+02:00) Helsinki, Riga, Tallinn" : return "GMT+2"; break;
		case "(GMT+02:00) Jerusalem" : return "GMT+2"; break;
		case "(GMT+03:00) Baghdad" : return "GMT+3"; break;
		case "(GMT+03:00) Kuwait, Riyadh" : return "SARABIA"; break;
		case "(GMT+03:00) Moscow, St. Petersburg, Volgograd" : return "MOSCOW"; break;
		case "(GMT+03:00) Nairobi" : return "GMT+3"; break;
		case "(GMT+03:30) Tehran" : return "TEHRAN"; break;
		case "(GMT+04:00) Abu Dhabi, Muscat" : return "UAE"; break;
		case "(GMT+04:00) Baku, Tbilisi, Yerevan" : return "GMT+4"; break;
		case "(GMT+04:30) Kabul" : return "KABUL"; break;
		case "(GMT+05:00) Ekaterinburg" : return "GMT+5"; break;
		case "(GMT+05:00) Islamabad, Karachi, Tashkent" : return "GMT+5"; break;
		case "(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi" : return "NEW_DELHI"; break;
		case "(GMT+05:30) Calcutta, Chennai, Mumbai, New Delhi" : return "NEW_DELHI"; break;
		case "(GMT+05:45) Kathmandu" : return "KATHMANDU"; break;
		case "(GMT+06:00) Almaty, Novosibirsk" : return "GMT+6"; break;
		case "(GMT+06:00) Astana, Dhaka" : return "GMT+6"; break;
		case "(GMT+06:00) Sri Jayawardenepura" : return "GMT+6"; break;
		case "(GMT+06:30) Rangoon" : return "BURMA"; break;
		case "(GMT+07:00) Bangkok, Hanoi, Jakarta" : return "BANGKOK"; break;
		case "(GMT+07:00) Krasnoyarsk" : return "GMT+7"; break;
		case "(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi" : return "BEIJING"; break;
		case "(GMT+08:00) Irkutsk, Ulaan Bataar" : return "GMT+8"; break;
		case "(GMT+08:00) Kuala Lumpur, Singapore" : return "GMT+8"; break;
		case "(GMT+08:00) Perth" : return "GMT+8"; break;
		case "(GMT+08:00) Taipei" : return "GMT+8"; break;
		case "(GMT+09:00) Osaka, Sapporo, Tokyo" : return "TOKYO"; break;
		case "(GMT+09:00) Seoul" : return "SEOUL"; break;
		case "(GMT+09:00) Yakutsk" : return "GMT+9"; break;
		case "(GMT+09:30) Adelaide" : return "ADELAIDE"; break;
		case "(GMT+09:30) Darwin" : return "DARWIN"; break;
		case "(GMT+10:00) Brisbane" : return "GMT+10"; break;
		case "(GMT+10:00) Canberra, Melbourne, Sydney" : return "CANBERRA"; break;
		case "(GMT+10:00) Guam, Port Moresby" : return "GMT+10"; break;
		case "(GMT+10:00) Hobart" : return "GMT+10"; break;
		case "(GMT+10:00) Vladivostok" : return "GMT+10"; break;
		case "(GMT+11:00) Magadan, Solomon Is., New Caledonia" : return "SOLOMON"; break;
		case "(GMT+12:00) Auckland, Wellington" : return "WELLINGTON"; break;
		case "(GMT+12:00) Fiji, Kamchatka, Marshall Is." : return "GMT+12"; break;
		case "(GMT+13:00) Nuku'alofa" : return "TONGA"; break;
		case "(GMT-01:00) Azores" : return "AZORES"; break;
		case "(GMT-01:00) Cape Verde Is." : return "GMT-1"; break;
		case "(GMT-02:00) Mid-Atlantic" : return "GMT-2"; break;
		case "(GMT-03:00) Brasilia" : return "BRAZIL"; break;
		case "(GMT-03:00) Buenos Aires, Georgetown" : return "B_AIRES"; break;
		case "(GMT-03:00) Greenland" : return "GMT-3"; break;
		case "(GMT-03:30) Newfoundland" : return "NEWFOUNDLAND"; break;
		case "(GMT-04:00) Atlantic Time (Canada)" : return "AT"; break;
		case "(GMT-04:00) Caracas, La Paz" : return "GMT-4"; break;
		case "(GMT-04:00) Santiago" : return "GMT-4"; break;
		case "(GMT-05:00) Bogota, Lima, Quito" : return "GMT-5"; break;
		case "(GMT-05:00) Eastern Time (US & Canada)" : return "ET"; break;
		case "(GMT-05:00) Indiana (East)" : return "EST"; break;
		case "(GMT-06:00) Central America" : return "GMT-6"; break;
		case "(GMT-06:00) Central Time (US & Canada)" : return "CT"; break;
		case "(GMT-06:00) Guadalajara, Mexico City, Monterrey" : return "GMT-6"; break;
		case "(GMT-06:00) Mexico City" : return "GMT-6"; break;
		case "(GMT-06:00) Saskatchewan" : return "GMT-6"; break;
		case "(GMT-07:00) Chihuahua, La Paz, Mazatlan" : return "GMT-7"; break;
		case "(GMT-07:00) Arizona" : return "MST"; break;
		case "(GMT-07:00) Mountain Time (US & Canada)" : return "MT"; break;
		case "(GMT-08:00) Pacific Time (US & Canada); Tijuana" : return "PT"; break;
		case "(GMT-09:00) Alaska" : return "ALSK"; break;
		case "(GMT-10:00) Hawaii" : return "HST"; break;
		case "(GMT-11:00) Midway Island, Samoa" : return "SAMOA"; break;
		case "(GMT-12:00) International Date Line West" : return "GMT-12"; break;
		case "(GMT-12:00) Eniwetok, Kwajalein" : return "ENIWETOK"; break; 	

		default : return "GMT"; break;
	}
}

function SetAccountInfo(oNode)
{
   var curTabIndex = -1;
   if (tab['PI'])
      curTabIndex = tab['PI'].curTab;

   if(oActNode.hasChildNodes())
   {
     if(oActNode.selectSingleNode('.//UniqueID').text == oNode.selectSingleNode('.//UniqueID').text) 
     {
	var tempNode = oActNode.cloneNode(true);

	var oCookie = tempNode.selectSingleNode('XMLClientCookie');
	if (oCookie)
		tempNode.removeChild(oCookie);	
	if (oActNode && (tempNode.xml != oNode.xml))
	{
		oRoot.removeChild(oActNode);
		AddChildNodes(oRoot, new Array(oNode));
		oActNode = oRoot.selectSingleNode("ACCOUNT");
		CreateXMLClientCookie();
		
		oActNode.setAttribute('readOnly', '1');
		BuildDiv('PI', oActNode);
		BuildTable('DV');
		oActNode.removeAttribute('readOnly');
		
		if (curTabIndex >= 0)
		   tab['PI'].head.children[curTabIndex].click();		
		
		if (!NodeValuesAreEqual(oNode, tempNode, new Array('.//CurrentCompositeStatus', './/CurrentDynamicStatus')))
			DisplayAccountStatus();
			
		UpdateStatusListItem(oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS').cloneNode(true));
		
		SetDocumentTitle();
		getObj('rr_enabled_toggle').checked = GetAccountFlag('RoutingEnabled');
		if (!b_CREATING_NEW_ACCOUNT && !b_LOGGED_ON)
		{
			bt_SESSION_STATUS |= _RECEIVED_USER_INFO;
			SetUserButtonPreference();
		}
		bt_ACCOUNT_STATUS = parseFloat(oActNode.selectSingleNode('.//AccountStatus//Status').text);
	}
	DisplayWebInviteIcon(); 
     }
             // We need to build the feature codes DIV here so that the DIV is built for all the accounts.
             // Also note that this DIV was previously being created in the BuildInterface() function. But it has been commented there now because the Table DV is no more built there.
        	BuildDiv('dv_feature_codes'); 
   }
   else
   {
	var tempNode = oActNode.cloneNode(true);

	var oCookie = tempNode.selectSingleNode('XMLClientCookie');
	if (oCookie)
		tempNode.removeChild(oCookie);
	
	if (oActNode && (tempNode.xml != oNode.xml))
	{
		oRoot.removeChild(oActNode);
		AddChildNodes(oRoot, new Array(oNode));
		oActNode = oRoot.selectSingleNode("ACCOUNT");
		CreateXMLClientCookie();
		
		oActNode.setAttribute('readOnly', '1');
		BuildDiv('PI', oActNode);
		BuildTable('DV');
		oActNode.removeAttribute('readOnly');
		
		if (curTabIndex >= 0)
		   tab['PI'].head.children[curTabIndex].click();		
		
		if (!NodeValuesAreEqual(oNode, tempNode, new Array('.//CurrentCompositeStatus', './/CurrentDynamicStatus')))
			DisplayAccountStatus();
			
		UpdateStatusListItem(oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS').cloneNode(true));
		
		SetDocumentTitle();
		getObj('rr_enabled_toggle').checked = GetAccountFlag('RoutingEnabled');
		if (!b_CREATING_NEW_ACCOUNT && !b_LOGGED_ON)
		{
			bt_SESSION_STATUS |= _RECEIVED_USER_INFO;
			SetUserButtonPreference();
		}
		bt_ACCOUNT_STATUS = parseFloat(oActNode.selectSingleNode('.//AccountStatus//Status').text);
		// We need to build the feature codes DIV here so that the DIV is built for the first time when logging in or creating account.
 		// Also note that this DIV was previously being created in the BuildInterface() function. But it has been commented there now because the Table DV is no more built there.
	        BuildDiv('dv_feature_codes'); 
	}
	//Do not display the CB tab right after user logs on. 
	getObj('vl_CB').style.display = "none";
	//This function call will determine if the CB tab can be displayed or not.
	DisplayWebInviteIcon(); 
   }
}

function NodeValuesAreEqual(node1, node2, xpath_array)
{
	var i=0;
	while (xpath_array[i])
	{
		var sub_node1 = node1.selectSingleNode(xpath_array[i]);
		var sub_node2 = node2.selectSingleNode(xpath_array[i]);
		if ((!sub_node1 || !sub_node2) || (sub_node1.text != sub_node2.text))
			return false;
		i++;
	}
	return true;
}

function CheckForcedPasswordChange()
{
	var nFlags = parseFloat(oActNode.selectSingleNode('Flags').text);
	if (nFlags & ACCOUNT_FLAGS_ChangePasswordNextLogin)
		ChangeAccountPassword(true);
}

function ChangeAccountPassword(bRequired)
{
	var type = (bRequired) ? 4:3;
	var del_dialog_values = Dialog(text('DLG/PI/PASS_CHG'), type);

	if ((del_dialog_values == null || del_dialog_values.length == 8) && bRequired)
		ChangeAccountPassword(true);

	if (del_dialog_values && del_dialog_values.length > 8)
	{
		var p_vals = ParseDelimitedList(del_dialog_values);
		var ret_val 	= p_vals[0];
		var old_pass 	= p_vals[1];
		var new_pass_1 	= p_vals[2];
		var new_pass_2 	= p_vals[3];

		if (eval(ToLower(ret_val)))
		{
			if ((!new_pass_1 && !new_pass_2) || (new_pass_1 != new_pass_2))
				Dialog(text('ERR/PASS_MIS'), type);
			else
			{
				var encrypt_old_pass = CallControlMethod("EncryptString", old_pass);
				var encrypt_new_pass = CallControlMethod("EncryptString", new_pass_1);
				var oOldAct = oActNode.cloneNode(true);
				var oPassNode = oActNode.selectSingleNode("Password");
				if (encrypt_old_pass == oPassNode.text)
				{
					oPassNode.text = encrypt_new_pass;
					var oFlagsNode = oActNode.selectSingleNode("Flags");
					var nFlags = parseFloat(oFlagsNode.text);
					oFlagsNode.text = (nFlags &= ~ACCOUNT_FLAGS_ChangePasswordNextLogin);
					CallControlMethod("EditXMLObject", oOldAct, oActNode);
					var cVals = GetRegistryValues();
					SetRegistryValues(cVals[0], encrypt_new_pass, cVals[2]);
				}
				else
					Dialog(text('ERR/PASS_NO'), type);
			}
		}
	}
}

var ACCOUNT_FLAGS_ChangePasswordNextLogin             = new Number(0x00000001);
var ACCOUNT_FLAGS_FixedLicense                        = new Number(0x00000002);
var ACCOUNT_FLAGS_RoutingEnabled                      = new Number(0x00000004);
var ACCOUNT_FLAGS_PositiveCallerID                    = new Number(0x00000008);
var ACCOUNT_FLAGS_ASRConfirmationPrompts              = new Number(0x00000010);
var ACCOUNT_FLAGS_UsingSharedDevice                   = new Number(0x00000020);
var ACCOUNT_FLAGS_RemindMeToSynchronize               = new Number(0x00000040);
var ACCOUNT_FLAGS_IncludeAccountsInPhoneClientSearch  = new Number(0x00000080);
var ACCOUNT_FLAGS_PhoneClientAutoLogon    	      = new Number(0x00000100);
var ACCOUNT_FLAGS_AccountDisabled                     = new Number(0x00000200);
var ACCOUNT_FLAGS_PromptToAddIdentifiedCaller 	      = new Number(0x00000400);
var ACCOUNT_FLAGS_WebInviteServicesAvailable          = new Number(0x00000800);
var ACCOUNT_FLAGS_WebInvite        		      = new Number(0x00001000);
var ACCOUNT_FLAGS_AutoSave			      = new Number(0x00002000);
 

function IsAutoSaveEnabled()
{
 var nFlags = parseFloat(oActNode.selectSingleNode('Flags').text);
 
 if (nFlags & ACCOUNT_FLAGS_AutoSave)
 {
  return true;
 }
 return false;
} 

 
function IsWebInviteServiceAvailable()
{
 var nFlags = parseFloat(oActNode.selectSingleNode('Flags').text);
 
 if (nFlags & ACCOUNT_FLAGS_WebInviteServicesAvailable)
 {
  return true;
 }
 return false;
} 

function IsWebInviteFlagSet()
{
    var nFlags = 0;
 if(oActNode.selectSingleNode('Flags') == null)
 {
    nFlags = 0;
 }
 else
 {
    nFlags = parseFloat(oActNode.selectSingleNode('Flags').text);
 }
 
 if (nFlags & ACCOUNT_FLAGS_WebInvite)
 {
  return true;
 }
 return false;
}


function ConfigureFlagsCheckboxes(bReturnBitmask, num)
{
//	var oRoutingEnabled 		= getObj('editRoutingEnabled');
	var oPositiveCallerID 		= getObj('editPositiveCallerID');
	var oUsingSharedDevice 		= getObj('editUsingSharedDevice');
	var oIncludeAccounts 		= getObj('editIncludeAccountsInPhoneClientSearch');
	var oASRConfirmPrompts 		= getObj('editASRConfirmationPrompts');
	var oPhoneClientAutoLogon 	= getObj('editPhoneClientAutoLogon');
	var oPromptToAddCaller		= getObj('editPromptToAddIdentifiedCaller');
	var oAutoSave			= getObj('editAutoSave');


	if (bReturnBitmask)
	{
		var bt_flags = num;
		//bt_flags = (oRoutingEnabled.checked) 		? (bt_flags |= ACCOUNT_FLAGS_RoutingEnabled) 						: (bt_flags &= ~ACCOUNT_FLAGS_RoutingEnabled);
		bt_flags = (oPositiveCallerID.checked) 		? (bt_flags |= ACCOUNT_FLAGS_PositiveCallerID) 						: (bt_flags &= ~ACCOUNT_FLAGS_PositiveCallerID);
		bt_flags = (oUsingSharedDevice.checked) 	? (bt_flags |= ACCOUNT_FLAGS_UsingSharedDevice) 					: (bt_flags &= ~ACCOUNT_FLAGS_UsingSharedDevice);
		bt_flags = (oIncludeAccounts.checked) 		? (bt_flags |= ACCOUNT_FLAGS_IncludeAccountsInPhoneClientSearch) 	: (bt_flags &= ~ACCOUNT_FLAGS_IncludeAccountsInPhoneClientSearch);
		bt_flags = (oASRConfirmPrompts.checked) 	? (bt_flags |= ACCOUNT_FLAGS_ASRConfirmationPrompts) 				: (bt_flags &= ~ACCOUNT_FLAGS_ASRConfirmationPrompts);
		bt_flags = (oPhoneClientAutoLogon.checked) 	? (bt_flags |= ACCOUNT_FLAGS_PhoneClientAutoLogon) 					: (bt_flags &= ~ACCOUNT_FLAGS_PhoneClientAutoLogon);
		bt_flags = (oPromptToAddCaller.checked) 	? (bt_flags |= ACCOUNT_FLAGS_PromptToAddIdentifiedCaller) 			: (bt_flags &= ~ACCOUNT_FLAGS_PromptToAddIdentifiedCaller);
		bt_flags = (oAutoSave.checked) 			? (bt_flags |= ACCOUNT_FLAGS_AutoSave) 					: (bt_flags &= ~ACCOUNT_FLAGS_AutoSave);
		return bt_flags;
	}
	else
	{
		//oRoutingEnabled.checked 				= (num & ACCOUNT_FLAGS_RoutingEnabled);
		//oRoutingEnabled.defaultChecked 			= (num & ACCOUNT_FLAGS_RoutingEnabled);
		
		oPositiveCallerID.checked 				= (num & ACCOUNT_FLAGS_PositiveCallerID);
		oPositiveCallerID.defaultChecked 		= (num & ACCOUNT_FLAGS_PositiveCallerID);
		
		oUsingSharedDevice.checked 				= (num & ACCOUNT_FLAGS_UsingSharedDevice);
		oUsingSharedDevice.defaultChecked 		= (num & ACCOUNT_FLAGS_UsingSharedDevice);
		
		oIncludeAccounts.checked 				= (num & ACCOUNT_FLAGS_IncludeAccountsInPhoneClientSearch);
		oIncludeAccounts.defaultChecked 		= (num & ACCOUNT_FLAGS_IncludeAccountsInPhoneClientSearch);
		
		oASRConfirmPrompts.checked 				= (num & ACCOUNT_FLAGS_ASRConfirmationPrompts);
		oASRConfirmPrompts.defaultChecked 		= (num & ACCOUNT_FLAGS_ASRConfirmationPrompts);
		
		oPhoneClientAutoLogon.checked 			= (num & ACCOUNT_FLAGS_PhoneClientAutoLogon);
		oPhoneClientAutoLogon.defaultChecked 	= (num & ACCOUNT_FLAGS_PhoneClientAutoLogon);
		
		oPromptToAddCaller.checked 				= (num & ACCOUNT_FLAGS_PromptToAddIdentifiedCaller);
		oPromptToAddCaller.defaultChecked 		= (num & ACCOUNT_FLAGS_PromptToAddIdentifiedCaller);
		
		oAutoSave.checked 				= (num & ACCOUNT_FLAGS_AutoSave);
		oAutoSave.defaultChecked 		= (num & ACCOUNT_FLAGS_AutoSave);
	}
}

function SetAccountFlag(str, bool)
{
	var oldAct = oActNode.cloneNode(true);
	var bt_flags = parseFloat(oActNode.selectSingleNode('Flags').text);
	var CUR_ACCOUNT_FLAG = eval('ACCOUNT_FLAGS_'+str);
	bt_flags = (bool) ? (bt_flags |= CUR_ACCOUNT_FLAG) : (bt_flags &= ~CUR_ACCOUNT_FLAG);
	oActNode.selectSingleNode('Flags').text = bt_flags;
	CallControlMethod('EditXMLObject', oldAct, oActNode);
	switch (str)
	{
		case 'RoutingEnabled':
		      break;
		      
		case 'PromptToAddIdentifiedCaller':
			oActNode.setAttribute('readOnly', '1');
			BuildDiv('PI', oActNode);
			BuildTable('DV');
			oActNode.removeAttribute('readOnly');
			tab['PI'].head.children[curTabIndex].click();
			break;
	}
}

function GetAccountFlag(str)
{
	var bt_flags = parseFloat(oActNode.selectSingleNode('Flags').text);
	return (bt_flags & eval('ACCOUNT_FLAGS_'+str));
}

function ToggleUserButtons(img)
{
	var bCollapsed = (GetImgSrc(img)=='iUserButtonToggleDn');
	ClientCookie(true, CLIENT_COOKIE_ExpandUserButtons, ((bCollapsed)?'true':'false'), true);
	BuildDiv('UB', oSys);
	img.src = (bCollapsed) ? 'img/iUserButtonToggleUp.gif' : 'img/iUserButtonToggleDn.gif';
	SetUserButtonPreference();
	if (b_toolbar_mode)
		 SizeToolbarWindow('none', true);
}

function CreateXMLClientCookie()
{
	var cookie_str = FindWebClientCookieEntry();
	var node = ParseDelimitedListToNodes('ClientCookie', cookie_str);
	var oXMLClientCookie = oSys.createElement('XMLClientCookie');
	var child = node.firstChild;
	while (child)
	{
		oXMLClientCookie.appendChild(child.cloneNode(true));
		child = child.nextSibling;
	}
	oActNode.appendChild(oXMLClientCookie);
}

var CLIENT_COOKIE_ToolbarOnTop 			= 'TOOL_BAR';
var CLIENT_COOKIE_ExpandUserButtons 	= 'USER_BUTTONS';
var CLIENT_COOKIE_SynchReminder		 	= 'SYNCH_REMINDER';
var WEB_CLIENT_TYPE = 1;

function FindWebClientCookieEntry()
{
	var cookie_string = oActNode.selectSingleNode('ClientCookie').text;
	var t_vals = ParseDelimitedList(cookie_string), i=0;
	while (t_vals[i])
	{
		if (parseFloat(t_vals[i]) == WEB_CLIENT_TYPE)
			return t_vals[i+1];
		i++
	}
	return null;
}

function BuildClientCookie(str)
{
	var cookie_string = oActNode.selectSingleNode('ClientCookie').text;
	var t_vals = ParseDelimitedList(cookie_string), i=0, index;
	while (t_vals[i])
	{
		if (parseFloat(t_vals[i]) == WEB_CLIENT_TYPE)
		{
			index = i;
			break;
		}
		i++
	}
	if (!IsNum(index))
	{
		t_vals[t_vals.length] = WEB_CLIENT_TYPE;
		t_vals[t_vals.length] = str;
	}
	else
		t_vals[index+1] = str
		
	return DelimitList(t_vals);
}

function ClientCookie(bSetValue, strNode, strValue, bUpdateAccount)
{
	var oCookie = oActNode.selectSingleNode('ClientCookie'), ret_val;
	var oXMLCookie = oActNode.selectSingleNode('XMLClientCookie');
	if (bSetValue)
	{
		if (bUpdateAccount)
			var oOldAct = oActNode.cloneNode(true);
		if (!oXMLCookie.selectSingleNode(strNode))
			oXMLCookie.appendChild(oSys.createElement(strNode));
		oXMLCookie.selectSingleNode(strNode).text = strValue;
		oCookie.text = BuildClientCookie(DelimitXMLNodes(oXMLCookie));
		// make sure the cookie has changed.
		if (bUpdateAccount && (oOldAct.selectSingleNode('.//ClientCookie').text != oActNode.selectSingleNode('ClientCookie').text))
			CallControlMethod('EditXMLObject', oOldAct, oActNode);
	}
	else
		return (oXMLCookie.selectSingleNode(strNode)) ? oXMLCookie.selectSingleNode(strNode).text : null;
}

var expand_user_buttons = 0;

function SetUserButtonPreference()
{
	expand_user_buttons = eval(ClientCookie(0, CLIENT_COOKIE_ExpandUserButtons));
	var oUB_style = document.styleSheets("GlobalStyles").rules.item(GetStyleSheetIndex('.user_button')).style;
	var oUBstatus_style = document.styleSheets("GlobalStyles").rules.item(GetStyleSheetIndex('.user_button_status')).style;
	oUB_style.backgroundImage = (expand_user_buttons) ? 'url(img/bgUserButtonExpanded.gif)' : 'url(img/bgUserButton.gif)';
	oUBstatus_style.display = (expand_user_buttons) ? '' : 'none';
}

function GetClientCookieDisplayPreferences()
{
	// update sort preferences
	var oTABLE_NODE = ParseDelimitedListToNodes('TABLE', ClientCookie(false, 'TABLE'));
	var child = oTABLE_NODE.firstChild;
	while (child)
	{
		var type = child.nodeName;
		var tbl = table[type];
		var oTblConfig = GetTableConfig(type);
	
	// determine a way to get the index of the name column so the FormatNameColumnHead will work even
	// in the case when the curSort is not the name column
	/*	var oNameHead = oTblConfig.selectSingleNode('head[@sort1="FirstName" and @sort2="LastName"]'); */
		if (tbl)
		{
			var prefs = ParseDelimitedList(child.text);
			if (prefs.length < 4)
				return;
			tbl.prevSort 		= tbl.curSort;
			tbl.curSort 		= prefs[0];
			tbl.prevSortIndex 	= tbl.curSortIndex;
			tbl.curSortIndex 	= parseFloat(prefs[1]);
			tbl.sortAscend 		= parseFloat(prefs[2]);
			tbl.curName 		= prefs[3];
	
			if (!isNaN(tbl.curSortIndex) && (tbl.curSort == 'FirstName' || tbl.curSort == 'LastName') && (type=='AB' || type=='TA' || type=='DSRS' || type=='GPAB' || type.indexOf('TARR')==0))
			{
				tbl.head.children[tbl.curSortIndex].propertyName = tbl.curSort;
				tbl.head.children[tbl.curSortIndex].innerHTML = FormatNameColumnHead(type, tbl.curName, GetTableConfig(type));
			}
			tbl.refresh();
		}
		child = child.nextSibling;
	}
	
	// update tab preferences
	var oTAB_NODE = ParseDelimitedListToNodes('TAB', ClientCookie(false, 'TAB'));
	var child = oTAB_NODE.firstChild;
	while (child)
	{
		var tbl = table[child.nodeName];
		if (tbl.tabs.length)
		{
			var tab = tbl.tabs[parseFloat(child.text)];
			if (!tab)
				tab = tbl.tabs[tbl.tabs.length-1];
			tab.click();
		}
		child = child.nextSibling;
	}
	
	// update select preferences
	var oSELECT_NODE = ParseDelimitedListToNodes('SELECT', ClientCookie(false, 'SELECT'));
	var child = oSELECT_NODE.firstChild;
	while (child)
	{
		var type = child.nodeName;
		var tbl = table[type];
		var t_vals = ParseDelimitedList(child.text);
		table[type].curFilterProperty = t_vals[0];
		table[type].curFilterValue = t_vals[1];
		SetSelectIndex(getObj('table_filter_select_'+type), t_vals[1], 1);
		tbl.refresh();
		child = child.nextSibling;
	}
	
	if (oABNode.childNodes.length > 30)
	{
		if (!oTABLE_NODE.selectSingleNode('AB') && table['AB'].curDisplayIndex=='11')
			table['AB'].tabs[1].click();
		if (!oTABLE_NODE.selectSingleNode('GPAB') && table['GPAB'].curDisplayIndex=='11')
			table['GPAB'].tabs[1].click();
	}
}

/*
<XMLClientCookie>
  <TOOL_BAR>true</TOOL_BAR> 
  <USER_BUTTONS>false</USER_BUTTONS> 
  <IMPORT_CONTACT_PHONE_PROMPT>true</IMPORT_CONTACT_PHONE_PROMPT>
  <TABLE>
  	<AB></AB>
  </TABLE>
 </XMLClientCookie>
*/

function SaveDisplayPreference(mode, type, pref)
{
	switch (mode)
	{
		case 'TABLE':
			var oTABLE_NODE = ParseDelimitedListToNodes('TABLE', ClientCookie(false, 'TABLE'));
			var oCurNode = oTABLE_NODE.selectSingleNode(type);
			if (!oCurNode)
				oCurNode = oTABLE_NODE.appendChild(oSys.createElement(type));
			oCurNode.text = pref;
			ClientCookie(true, 'TABLE', DelimitXMLNodes(oTABLE_NODE), true);
			break;
			
		case 'TAB':
			var oTAB_NODE = ParseDelimitedListToNodes('TAB', ClientCookie(false, 'TAB'));
			var oCurNode = oTAB_NODE.selectSingleNode(type);
			if (!oCurNode)
				oCurNode = oTAB_NODE.appendChild(oSys.createElement(type));
			oCurNode.text = pref;
			ClientCookie(true, 'TAB', DelimitXMLNodes(oTAB_NODE), true);
			break;
			
		case 'SELECT':
			var oSELECT_NODE = ParseDelimitedListToNodes('SELECT', ClientCookie(false, 'SELECT'));
			var oCurNode = oSELECT_NODE.selectSingleNode(type);
			if (!oCurNode)
				oCurNode = oSELECT_NODE.appendChild(oSys.createElement(type));
			oCurNode.text = pref;
			ClientCookie(true, 'SELECT', DelimitXMLNodes(oSELECT_NODE), true);
			break;
	}
}

function CheckSynchAddressBookReminder()
{
	if (eval(ClientCookie(false, CLIENT_COOKIE_SynchReminder)))
	{
		var last_synch = (ClientCookie(false, 'SYNCH_TIMESTAMP')) ? parseFloat(ClientCookie(false, 'SYNCH_TIMESTAMP')) : 0;
		var now = new Date();
		if (now.getTime() > last_synch)
		{
			var rows = '<row><input type="checkbox">'+text('DLG/NO_SHOW_PROMPT')+'</input></row>';
			var ret_vals = ParseDelimitedList(Dialog(text('DLG/AB/SYCH_REMIND'), 1, rows));
			if (eval(ret_vals[0]))
			{
				getObj('vl_CT').click();
				BeginSynch();
			}
			else
				SetTimestampForNextSynch(7);
			
			if (eval(ret_vals[1]))
				ClientCookie(true, CLIENT_COOKIE_SynchReminder, 'false', true);
		}
	}
}

function SetTimestampForNextSynch(number_of_days)
{
	var now = new Date();
	var synch_timestamp = now.getTime() + (1000 * 60 * 60 * 24 * number_of_days);
	ClientCookie(true, 'SYNCH_TIMESTAMP', synch_timestamp, true);
}

function DelimitXMLNodes(oNode)
{
	var t_vals = new Array;
	var child = oNode.firstChild;
	while (child)
	{
		t_vals[t_vals.length] = DelimitList(new Array(child.nodeName, child.text));
		child = child.nextSibling;
	}
	return DelimitList(t_vals);
}

function ParseDelimitedListToNodes(node_name, text)
{
	var oNode = oSys.createElement(node_name);
	if (text)
	{
		var t_vals = ParseDelimitedList(text), i=0;
		while (t_vals && t_vals[i])
		{
			var node_val = ParseDelimitedList(t_vals[i]);
			if(node_val[0])
			{
				var child = oSys.createElement(node_val[0]);
				child.text = node_val[1];
				oNode.appendChild(child);
			}
			i++;
		}
	}
	return oNode;
}

function DisplayAccountStatus()
{
	var oIcon = getObj('act_notification');
	var icon_src 	= (oIcon && GetImgSrc(oIcon)=='iMessage') ? 'iMessage.gif' : 'pix.gif';
	var icon_class 	= (oIcon && GetImgSrc(oIcon)=='iMessage') ? 'icon_hot' : 'icon';

	var x = "<?xml version=\"1.0\"?><xsl:stylesheet xmlns:xsl=\"http://www.w3.org/TR/WD-xsl\">";

	x+= "<xsl:template match=\"R\">";
//	x+= 	"<div class=\"statRow\" style=\"margin-top:7px;\">";
//	x+= 	"<div class=\"statRow\" style=\"margin-top:40px; margin-left:160px;\">";
//	x+=		"<div class='menulogo' style='width:200px; height:75px; position:absolute; top:25px; left:25px;' onclick=\"window.open('http://www.inter-tel.com')\"></div>";
	x+=		"<div class='menulogo' style='width:200px; height:75px; position:absolute; top:10px; left:25px;' onmouseover=\"window.status='Click Here to Launch the Inter-Tel Website.'\" onmouseout=\"window.status=PRODUCT_NAME_AND_VERSION\" onclick=\"window.open('http://www.inter-tel.com')\"></div>";
//	x+=		"<div class='menulogo' style='width:200px; height:75px; position:absolute; top:7px; left:7px;' onmouseover=\"window.status='Click Here to Launch the Inter-Tel Website.'\" onmouseout=\"window.status=PRODUCT_NAME_AND_VERSION\" onclick=\"window.open('http://www.inter-tel.com')\"></div>";
	x+= 	"<div class=\"statRow\" style=\"width:700px; height:30px; position:absolute; top:55px; left:7px;\">";
//	x+= 	"<div class=\"statRow\" style=\"width:700px; height:25px; position:absolute; top:53px; left:7px;\">";
	x+= 		"<xsl:apply-templates select=\"ACCOUNT//CONTACT\" />";
	x+= 		"<xsl:apply-templates select=\"COMPOSITES\"/>";
	x+= 	"</div>";
	x+= "</xsl:template>";
	
	x+= "<xsl:template match=\"CONTACT\">";
	x+= "<xsl:script><![CDATA[";
	x+= GetEmbeddedRemoveNodePrefixScript();
	x+= GetEmbeddedFormatPhoneNumberScript();
	x+= GetEmbeddedAccountFieldValueScript();
	x+= "]]></xsl:script>";
	
	x+= 	"<span style=\"height:10px;padding:0px;\">";
	x+= 	"<img id=\"act_notification\" src=\"img/"+ icon_src +"\" class=\""+icon_class+"\" style=\"margin:3px 3px 0px 0px;vertical-align:top\" onclick=\"getObj('vl_MS').click()\"/>";
	x+= 	"<xsl:choose>";
	x+=		"<xsl:when test=\"AccountStatus//Available[.='true' or .='True' or .='TRUE']\"><img src=\"img/iActUI.gif\" class=\"icon\" style=\"margin-top:3px;vertical-align:top\"/></xsl:when>";
	x+=		"<xsl:otherwise><img src=\"img/iActUNAVUI.gif\" class=\"icon\" style=\"margin-top:3px;vertical-align:top\"/></xsl:otherwise>";
	x+=		"</xsl:choose>";
	x+=			"<span style=\"height:10px;padding:0px 5px;vertical-align:top\">";
	x+= 			"<xsl:for-each select=\"/R/COMPOSITES/COMPOSITE_STATUS[Description = context(-1)/AccountStatus//CurrentCompositeStatus]\">";
//commented in UC 4.0 to remove the display of location name and instead display the name of the user logged in.
/*	x+=					"<xsl:choose>";
	x+=						"<xsl:when test=\".[number(LocationType) = 0]\"><xsl:value-of select=\"LocationName\" /></xsl:when>"; //<xsl:for-each select=\"[0]\"></xsl:for-each>
	x+=						"<xsl:when test=\".[number(LocationType) = 1]\"><xsl:value-of select=\"/R/DEVICES/DEVICE[DeviceStatus//NodeColonExtension = context(-1)/LocationNumber]/Name\" /></xsl:when>"; //<xsl:for-each select=\"[0]\"></xsl:for-each>
	x+=						"<xsl:when test=\".[number(LocationType) $gt$ 1]\"><xsl:value-of select=\"/R/CONTACT_FIELDS/FIELD[@locType = context(-1)/LocationType]\" /></xsl:when>";
	x+=					"</xsl:choose>";
*/
	x+=					"<xsl:value-of select=\"/R/ACCOUNT/ContactElements/CONTACT/FirstName\" />";
	x+=					" ";
	x+=					"<xsl:value-of select=\"/R/ACCOUNT/ContactElements/CONTACT/LastName\" />";
//	x+=					"<span style=\"height:10px;padding:4px 0px 0px 5px;color:#9cf;\">";
	x+=					"<span style=\"height:10px;padding:4px 0px 0px 5px;color:#23A;\">";
	x+=						"<xsl:if test=\".[number(LocationType) $lt$ 2]\"><xsl:eval>removeNodePrefix(this, 'LocationNumber')</xsl:eval></xsl:if>";
//	x+=						"<xsl:if test=\".[number(LocationType) $gt$ 1]\"><xsl:for-each select=\"/R/CONTACT_FIELDS/FIELD[@locType = context(-1)/LocationType][0]\"><xsl:eval>removeNodePrefix(this, '/R/ACCOUNT//*[nodeName() = context(-1)/@name]')</xsl:eval></xsl:for-each></xsl:if>";
	x+=						"<xsl:if test=\".[number(LocationType) $gt$ 1]\"><xsl:for-each select=\"/R/CONTACT_FIELDS/FIELD[@locType = context(-1)/LocationType][0]\"><xsl:eval>getAccountValue(this)</xsl:eval></xsl:for-each></xsl:if>";
	x+=					"</span>";
	x+= 			"</xsl:for-each>";
	x+=			"</span>";
	x+=		"</span>";
	x+= "</xsl:template>";
	
	x+= "<xsl:template match=\"COMPOSITES\" xml:space=\"preserve\">";
	x+= 	"<span>";
	x+= 		"<select id=\"AccountCompositeStatusSelect\" class=\"CompositeStatusSelect\" onmouseup=\"CheckForSelectedDynamicStatus(this)\" onchange=\"UpdateCompositeStatusForAccount(this)\">";
	x+= 			"<xsl:for-each select=\"COMPOSITE_STATUS\" order-by=\"Description\">";
	x+= 				"<xsl:element name=\"option\">";
	x+= 					"<xsl:attribute name=\"value\"><xsl:value-of select=\"Description\" /></xsl:attribute>";
	x+= 					"<xsl:value-of select=\"Description\" /> <xsl:if test=\".[(DynamicStatus='true' or DynamicStatus='True' or DynamicStatus='TRUE') and Description = /R/ACCOUNT//AccountStatus//CurrentCompositeStatus]\"><xsl:value-of select=\"/R/ACCOUNT//AccountStatus//CurrentDynamicStatus\" /></xsl:if>";

//	var extension_Number = removeNodePrefix(this, 'LocationNumber');
//	x+=					"<xsl:if test=\".[(number(LocationType) $lt$ 2) and  (LocationNumber = /R/COMPOSITES//LIST//NodeID  : /R/COMPOSITES//LIST//Extension )]\"><xsl:value-of select=\"/R/COMPOSITES//LIST//SecondaryMessage\" /></xsl:if>";
	x+= 				"</xsl:element>";
	x+= 			"</xsl:for-each>";
	x+= 		"</select>";
//	x+= 		"<img src=\"img/iCSAddTemp.gif\" style=\"margin-left:7px;vertical-align:top;cursor:hand;\" onclick=\"CreateTemporaryCompositeStatus()\" title=\""+text('CS/TEMP_CS')+"\"/>";
//      changed the temporary status creation wizard to a quick status creation wizard. 
	x+= 		"<img src=\"img/iCSAddTemp.gif\" style=\"margin-left:7px;vertical-align:top;cursor:hand;\" onclick=\"CheckForDynamicStatus()\" title=\""+text('CS/TEMP_CS')+"\"/>";

	x+= 	"</span>";

	x+= "</xsl:template>";
	x+= "</xsl:stylesheet>";
	
	xTmp.loadXML(x);
	CheckError(xTmp);
	var output = oRoot.transformNode(xTmp);

	getObj('AccountInfo').innerHTML = output;
	DisplayCurrentCompositeStatusForAccount();
}



function DisplayCurrentCompositeStatusForAccount()
{
	var oSelect = getObj("AccountCompositeStatusSelect");
	var composite_status = oActNode.selectSingleNode(".//AccountStatus//CurrentCompositeStatus").text;
	SetSelectIndex(oSelect, composite_status, 0);
}

function MessageNotification(bDisplay)
{
	var oIcon = getObj('act_notification');
	if (oIcon)
	{
		oIcon.src 		= (bDisplay && oMsgNode.hasChildNodes()) ? 'img/iMessage.gif' : 'img/pix.gif';
		oIcon.className = (bDisplay && oMsgNode.hasChildNodes()) ? 'icon_hot' : 'icon';
		getObj('MS').onclick = (bDisplay) ? MessageNotification : null;
	}
}

var aCurProcess = new Array(null, 0);
var b_CREATING_NEW_ACCOUNT=0, b_NEW_DEVICES_RECEIVED, b_NEW_ACCOUNT_DEVICE_SEARCH_IN_PROGRESS, b_DELETING_ACCOUNT=0;

function ShowNewAccountForm()
{
	b_CREATING_NEW_ACCOUNT=1;
	b_NEW_DEVICES_RECEIVED=0;
	b_NEW_ACCOUNT_DEVICE_SEARCH_IN_PROGRESS=0;
	
	Hide('LOGON');
	aCurProcess[0]='NA';
	var oDiv = document.createElement('DIV');
	oDiv.setAttribute('id', 'NA');
	document.body.insertBefore(oDiv, getObj('PREF'));
	oDiv.outerHTML = CreateSingleDiv(oComponents.selectSingleNode('CONTENT[@abbr="NA"]'));
	// reset the variable grabbing it from the document tree
	oDiv = getObj('NA');
	var oChromeLogoDiv = document.createElement('DIV');
	oChromeLogoDiv.innerHTML = "<img src='img/UC_Transparent.gif'>";
	oChromeLogoDiv.style.backgroundColor='#EEE'; 
/*	oChromeLogoDiv.style.backgroundImage='url(img/bgHeader.gif)'; */
	oChromeLogoDiv.style.backgroundPosition='top center';
	oChromeLogoDiv.style.border='1px solid #000';
	oChromeLogoDiv.style.borderBottom='none';
	oChromeLogoDiv.style.padding='10px 10px';
	oChromeLogoDiv.style.textAlign='right';
	oDiv.insertBefore(oChromeLogoDiv, oDiv.firstChild);
	var oStripDiv = document.createElement('DIV');
/*	oStripDiv.setAttribute("id", "strip1"); */
	oDiv.insertBefore(oStripDiv, oDiv.firstChild);
	oDiv.children['buttons'].style.backgroundColor='';
	oDiv.children['buttons'].style.border='none';
	
	BuildDiv('NA', oObjConfig.selectSingleNode('processes/process[@for="NA"]'));
	BuildTable('NADL');
	table['NADL'].body.innerHTML = "<div class=\"tableRow\" style=\"background-color:#fff;padding:5px;\"><img src=\"img/iWaiting_ani.gif\" class=\"icon\"/>"+text('NA/DVSRCH')+"</div>";
	Show('NA');
	SetNewAccountInfo();
}

var b_NEW_ACCOUNT_DEVICE_SEARCH_IN_PROGRESS=0;
var b_NEW_DEVICES_RECEIVED = 0;

function CheckForNewAccountDevices()
{

	if (b_CREATING_NEW_ACCOUNT && oDevNode.childNodes.length == oSearchNode.selectNodes('NA/CONTACT[not(@failed)]').length)
	{
		b_NEW_DEVICES_RECEIVED = 1;
		aCurProcess[1] = 2;
		SetNewAccountInfo();
	}
}

function SetNewAccountInfo()
{
	var oProcessConfig = oObjConfig.selectSingleNode('processes/process[@for="'+aCurProcess[0]+'"]');
	
	switch (aCurProcess[1])
	{
		// set username / password
		case 1:
		b_PREVENT_LOGOFF=0;
		var oNewFirstNameInput = getObj('na_first_name');
		var oNewMiddleNameInput = getObj('na_middle_name');
		var oNewLastNameInput = getObj('na_last_name');
		var oNewUsernameInput = getObj('na_username');
		var oNewPass1Input = getObj('na_password1');
		var oNewPass2Input = getObj('na_password2');
	
		if (!b_NEW_ACCOUNT_DEVICE_SEARCH_IN_PROGRESS)
		{
			if (IsValid(oNewFirstNameInput) || IsValid(oNewMiddleNameInput) || IsValid(oNewLastNameInput))
			{
				if (IsValid(oNewUsernameInput) && IsValid(oNewPass1Input) && IsValid(oNewPass2Input))
				{
					if (oNewPass1Input.value == oNewPass2Input.value)
					{
						var sEncryptPass = CallControlMethod('EncryptString', oNewPass1Input.value);
						var ret_val = CallControlMethod('CreateAccountSynch', oNewUsernameInput.value, sEncryptPass);
						// retval will return 'undefined' in the case where a matching account is found - don't perform the search
						if (ret_val=='' && !b_MULT_TENANT_GROUPS_PRESENT)
						{
							cur_search_type='NA';
							b_NEW_ACCOUNT_DEVICE_SEARCH_IN_PROGRESS=1;
							CallControlMethod('Search', oNewFirstNameInput.value+' '+oNewLastNameInput.value, GetDeviceSearchCriteria());
							if(getObj('dv_feature_codes'))
								getObj('dv_feature_codes').previousSibling.style.display='none';
						}
						else
							return;
					}
					else
					{
						Dialog(text('ERR/NA_PASS_MISS'),0);
						return;
					}
				}
				else
				{
					Dialog(text('ERR/NA_FIELDS'),0);
					return;
				}
			}
			else
			{
				Dialog(text('ERR/NA_NAMES'),0);
				return;
			}
		}
		// method call on AX to create account here
		// add step in SetAccountInfo to check new disabled field and step field
		// to return to these code to move on the device addition
		break;
		
		case 2:
		// create devices for all current contacts objects
		if (oSearchNode.selectSingleNode('NA').hasChildNodes() && !b_NEW_DEVICES_RECEIVED)
		{
			var oOldActNode = oActNode.cloneNode(true);
		
			oActNode.selectSingleNode('.//CONTACT/FirstName').text = getObj('na_first_name').value;
			oActNode.selectSingleNode('.//CONTACT/MiddleName').text = getObj('na_middle_name').value;
			oActNode.selectSingleNode('.//CONTACT/LastName').text = getObj('na_last_name').value;
			CallControlMethod('EditXMLObject', oOldActNode, oActNode);

			var oPrimaryRadio = GetSelectedRadio('na_device_primary');
			var oPrimaryCheckbox = (oPrimaryRadio) ? oPrimaryRadio.parentElement.parentElement.firstChild.firstChild : null;
			
			// make sure a primary device has been selected
			if (!oPrimaryRadio || !oPrimaryCheckbox || !oPrimaryCheckbox.checked) 
			{
				Dialog(text('ERR/NA_PRI_DV'),0);
				return;
			}
			
			// grab the rows for devices to add
			var aRows = getObj('tableNADL').children[1].children, i=0, j=0, k=0;
			
			// check for valid names and passwords on all checked boxes
			while (aRows[i])
			{
				var row = aRows[i];
				var oAddCheckbox 	= row.children[0].firstChild;
				var oNameInput 		= row.children[1].firstChild;
				var oPassInput 		= row.children[3].firstChild;
				if (oAddCheckbox && oAddCheckbox.checked && (!IsValid(oNameInput) || !IsValid(oPassInput)))
				{
					Dialog(text('DLG/DV/VAL'),0);
					return;
				}
				i++;
			}

			// find and add the primary device
			while (aRows[j])
			{
				var row = aRows[j];
				// find the primary device and add it
				if (row.children[0].firstChild.checked && row.children[4].firstChild.checked)
				{
					AddDevice(row.children[1].firstChild.value, row.children[4].firstChild.ext, row.children[3].firstChild.value, true);
					break;
				}
				j++;
			}


			// find and add the non-primary devices
			while (aRows[k])
			{
			 	var row = aRows[k];
				var oAddCheckbox 	= row.children[0].firstChild;
				var oNameInput 		= row.children[1].firstChild;
				var oPassInput 		= row.children[3].firstChild;
				var oPrimaryRadio	= row.children[4].firstChild;
				
				if (oAddCheckbox && oAddCheckbox.checked && !oPrimaryRadio.checked)
					AddDevice(oNameInput.value, oPrimaryRadio.ext, oPassInput.value, false);
				else if (oAddCheckbox && !oAddCheckbox.checked)
					oSearchNode.selectSingleNode('NA').removeChild(oSearchNode.selectSingleNode(Insert(oPrimaryRadio.ext,'NA/CONTACT[WorkNumber1="{0}"]')));
				k++;
			}
			

			

		}
		else
		{
			// if at least one device was successfully added
			if (oDevNode.hasChildNodes())
			{
				BuildDiv('NAPI', oActNode);
				
//				getObj('NAPI').lastChild.firstChild.style.backgroundColor='#A37A29';
				getObj('NAPI').lastChild.firstChild.style.backgroundColor='#EFEFF7';

				getObj('editType').value = 'edit';
				SetAdvancedTab(oActNode, 1);
				aCurProcess[1] = 3;
			}
			else
			{
				b_NEW_DEVICES_RECEIVED=0
				var child = oSearchNode.selectSingleNode('NA').firstChild;
				while (child)
				{
					child.removeAttribute('failed');
					child = child.nextSibling;
				}
				Hide('NALS');
				Show('NADV');
				table['NADL'].refresh();
				Dialog(text('ERR/NA_NO_DV'),0);
				SetButtons('NA');
				return;
			}
		}
		break;
		
		case 3:
		// this step displays the 'wait while we import' message
		break;
		
		case 4:
		SaveEdit();
		SetRegistryValues(getObj('na_username').value, '', false);
		getObj('NA').outerHTML='';
		b_LOGGED_ON=1;
		b_CREATING_NEW_ACCOUNT=0;
		BuildTable('DV');
		BuildDiv('dv_feature_codes');
		DisplayInterface();
		DisplayAccountStatus();
		LaunchHelp('Start');
		break;
		
		case 5:
		// complete stuff here
		break;
	
	}
	var oCurSection = oProcessConfig.selectSingleNode('section[@for="'+aCurProcess[1]+'"]');
	if (oCurSection)
		Hide(oCurSection.getAttribute('id'));
	aCurProcess[1]++;
	var oNextSection = oProcessConfig.selectSingleNode('section[@for="'+aCurProcess[1]+'"]');
	if (oNextSection)
		Show(oNextSection.getAttribute('id'));
		
	if (aCurProcess[1]==3)
		getObj('NA').children['buttons'].innerHTML = '';
	else
		SetButtons('NA');
}

function GoPreviousNewAccountStep(b_DELETE_ACCOUNT)
{
	var oProcessConfig = oObjConfig.selectSingleNode('processes/process[@for="'+aCurProcess[0]+'"]');
	aCurProcess[1]--;
	switch (aCurProcess[1])
	{
		case 0:
			if (aCurProcess[0]=='NA')
			{
				getObj('NA').outerHTML = '';
				b_CREATING_NEW_ACCOUNT=0;
				Show('LOGON');
			}
			break;
			
		case 1:
			CallControlMethod('DeleteXMLObject', oActNode.cloneNode(true));
			CallControlMethod('Logoff');
			RemoveChildNodes(oCompStatusNode);
			var oLicenseStatus = oRoot.selectSingleNode('LICENSE_STATUS');
			if (oLicenseStatus)
				oRoot.removeChild(oLicenseStatus);
			break;
		
		case 2:
		case 3:
			var ret_vals = ParseDelimitedList(Dialog(text('DLG/NA/DEL_ACT'), 1));
			if (eval(ret_vals[0]))
			{
				aCurProcess[1]=1;
				b_PREVENT_LOGOFF=1;
				b_NEW_DEVICES_RECEIVED=0;
				b_NEW_ACCOUNT_DEVICE_SEARCH_IN_PROGRESS=0;
				RemoveChildNodes(oDevNode);
				RemoveChildNodes(oNodesNode);
				RemoveChildNodes(oCompStatusNode);
				RemoveChildNodes(oGroupsNode);
				RemoveChildNodes(oSearchNode.selectSingleNode('NA'));
				var oLicenseStatus = oRoot.selectSingleNode('LICENSE_STATUS');
				if (oLicenseStatus)
					oRoot.removeChild(oLicenseStatus);
				CallControlMethod('DeleteXMLObject', oActNode.cloneNode(true));
				CallControlMethod('Logoff');
				RemoveChildNodes(oActNode);
				Hide('NAPI');
				Hide('NADV');
				Hide('NALS');
				Show('NAUN');
				table['NADL'].refresh();
				//ShowNewAccountForm();
			}
			else
			{
				aCurProcess[1]++;
				return;
			}
			break;
	}
	var oPrevSection = oProcessConfig.selectSingleNode('section[@for="'+(aCurProcess[1]+1)+'"]');
	if (oPrevSection)
		Hide(oPrevSection.getAttribute('id'));
	var oCurSection = oProcessConfig.selectSingleNode('section[@for="'+aCurProcess[1]+'"]');
	if (oCurSection)
		Show(oCurSection.getAttribute('id'));
	SetButtons('NA');
}

function CheckListedNewAccountDevices()
{	
	var devices = oSearchNode.selectNodes('NA/CONTACT'),i=0;
	while (devices[i])
		getObj('na_device_add_'+devices[i++].selectSingleNode('WorkNumber1').text).checked = true;
}

/*
<CurrentCompositeStatus>
<CUR_COMPOSITE_STATUS>
<TenantGroup /> 
<Account /> 
<Owner>0</Owner> 
<Description /> 
<Available>TRUE</Available> 
</CUR_COMPOSITE_STATUS>
</CurrentCompositeStatus>
*/

// ****************************************************
// *****************  Updated Methods  ****************
// ****************************************************
 
var oHelpWin;
function LaunchHelp(str)
{
	var NEW_URL, HELP_URL=config('HELP_FILE_NAME'), START_URL='QuickStartHelp/Quickstart.htm';
	var COLLABORATE_HELP='UC_WCRS_OnlineHelp/Linktivity_User_Guide.htm';
	switch (str)
	{
		case 'Help':
			NEW_URL = HELP_URL;
			break;
			
		case 'Start':
			NEW_URL = START_URL;
			break;

		case 'Collaborate':
			NEW_URL = COLLABORATE_HELP;
			break;
	}
	if (!oHelpWin || oHelpWin.closed)
		oHelpWin = window.open(NEW_URL, 'HelpWindow', '');
	else
	{
		// if the help window is open, replace the current portion of the help url with the new
//		oHelpWin.location.href = oHelpWin.location.href.replace( ((str=='Help') ? TUTORIAL_URL : HELP_URL) , NEW_URL);
		oHelpWin.location.href = oHelpWin.location.href.replace( ((str=='Help') ? HELP_URL : HELP_URL) , NEW_URL);
		oHelpWin.focus();
	}
}

// ****************************************************
// *********************  DEVICES  ********************
// ****************************************************

var oCurDevNode;

function ToggleDeviceForm(b_SHOW_FORM)
{
	if (b_SHOW_FORM)
	{
		Show('dv_add_form');
		SetFocus('add_device_name');
		getObj('PI').children['buttons'].innerHTML='';
	}
	else
	{
		Hide('dv_add_form');
		SetButtons('DV');
	}
}

function SaveDevice()
{
	bAddDevice=0;
	var oNameInput = getObj('add_device_name');
	var oExtInput = getObj('add_device_ext');
	var oPassInput = getObj('add_device_pass');
	
	if (IsValid(oNameInput) && IsValid(oExtInput))
	{
		// if this is not a new account and adding a device from the device view
		if (!b_CREATING_NEW_ACCOUNT)
		{
			var account_id =  oActNode.selectSingleNode('.//UniqueID').text;
			var oMatchNameNode = FindExistingNodeValue(oDevNode, 'Name', oNameInput.value);
			if (oMatchNameNode && account_id != oMatchNameNode.selectSingleNode('OwnerAccount').text)
				oMatchNameNode = null;
			var oMatchExtNode = FindExistingNodeValue(oDevNode, 'Extension', oExtInput.value);
			if (oMatchExtNode && account_id != oMatchExtNode.selectSingleNode('OwnerAccount').text)
				oMatchExtNode = null;

			if (oMatchNameNode)
				Dialog(text('DLG/DV/MCH_NM'),0);
			else if (oMatchExtNode)
				Dialog(text('DLG/DV/MCH_EX'),0);
			else
			{
				AddDevice(oNameInput.value, oExtInput.value, oPassInput.value);
				ToggleDeviceForm(0);
			}
		}
		// if this device is being adding during the new account wizard
		else
		{
			var now = new Date();
			var oCurNode = GetTemplate('CONTACT');
			oCurNode.selectSingleNode('UniqueID').text = now.getTime();
			oCurNode.selectSingleNode('FirstName').text = oNameInput.value;
			oCurNode.selectSingleNode('WorkNumber1').text = oExtInput.value;
			// stuff the password in a temporary location for later use
			oCurNode.selectSingleNode('CallerIDNumber').text = oPassInput.value;
			oSearchNode.selectSingleNode('NA').appendChild(oCurNode.cloneNode(true));
			AddNewRow('NADL', oCurNode);
			SetTableStyle(table['NADL'].body);
			CheckListedNewAccountDevices();
		}
		oNameInput.value='';
		oExtInput.value='';
		oPassInput.value='';
	}
	else
		Dialog(text('DLG/DV/VAL_ALL'),0);
	oCurDevNode = null;
}

function AddDevice(sName, sExt, sPass, b_PRIMARY)
{
	var now = new Date();
	oNewNode = GetTemplate('DEVICE');
	oNewNode.selectSingleNode('Name').text = sName;
	oNewNode.selectSingleNode('Extension').text = sExt;
	oNewNode.selectSingleNode('OwnerAccount').text = oActNode.selectSingleNode('.//UniqueID').text;
	oNewNode.selectSingleNode('TenantGroup').text = oActNode.selectSingleNode('.//TenantGroup').text;
	if (b_PRIMARY)
	{
		var oFlags = oNewNode.selectSingleNode('Flags');
		var nFlags = parseFloat(oFlags.text);
		oFlags.text = nFlags |= DEVICE_FLAG_IS_PRIMARY;
	}
	var sEncryptPass = CallControlMethod('EncryptString',sPass);
	if (b_PRIMARY == null && !oDevNode.hasChildNodes())
	{
		var oFlags = oNewNode.selectSingleNode('Flags');
		var nFlags = eval(oFlags.text);
		oFlags.text = nFlags |= DEVICE_FLAG_IS_PRIMARY;
	}
	//oDevNode.appendChild(oNewNode);
	CallControlMethod('AddXMLObject', oNewNode.cloneNode(true), sEncryptPass);
}

function DeleteDevice(sUniqueID)
{
	var oCurDevNode = oDevNode.selectSingleNode('DEVICE[Extension = '+sUniqueID +']');
	var node_colon_ext = oCurDevNode.selectSingleNode('NodeID').text+':'+oCurDevNode.selectSingleNode('Extension').text;
	if (Confirm('DV') && !CheckForObjectReferenceInRoutingRules('DV', node_colon_ext))
	{
		var node_id = oCurDevNode.selectSingleNode('NodeID').text;
		var ext = oCurDevNode.selectSingleNode('Extension').text;
		oDevNode.removeChild(oCurDevNode);
		if (!oDevNode.selectSingleNode('DEVICE[NodeID="'+node_id+'"]'))
			RemoveNode(node_id);
		CallControlMethod('DeleteXMLObject',oCurDevNode,true);
		table['DV'].refresh();
		HideCompositeStatusForm();
		if (getObj('dv_feature_codes').Node == node_id && getObj('dv_feature_codes').Extension == ext)
		{
			getObj('dv_feature_codes').Node = '';
			getObj('dv_feature_codes').Extension = '';
			if (getObj('dv_feature_codes').style.display=='')
			{
				Hide('dv_feature_codes');
				table['DV'].body.style.height = '';
			}
		}
	}
}

function RemoveNode(node_id)
{
	var oRequestedNodes = oLogonNode.selectSingleNode('RequestedNodes');
	oRequestedNodes.removeChild(oRequestedNodes.selectSingleNode('Node[@id="'+node_id+'"]'));
	oNodesNode.removeChild(oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID="'+node_id+'"]'));
}

function SetDeviceVoicemailPassword(sUniqueID)
{
	var oDevObj = oDevNode.selectSingleNode('DEVICE[Extension = '+sUniqueID +']');
	var retVal = Dialog(text('DLG/DV/VM_PASS'),8);
	var tVals = ParseDelimitedList(retVal);
	if (eval(tVals[0]))
	{
		var oOldObj = oDevObj.cloneNode(true);
		oDevObj.selectSingleNode('VoicemailPassword').text = CallControlMethod('EncryptString', tVals[1]);
		CallControlMethod('EditXMLObject', oOldObj, oDevObj);
	}
}

function UpdateDeviceInterface(oDevice, b_UPDATE_ALL)
{	
	while (oDevice)
	{
		var sExt = oDevice.selectSingleNode('Extension').text;
		var oParentNode = oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID="'+oDevice.selectSingleNode('NodeID').text+'"]')
		var oNameInput = getObj('dv_name_'+sExt);
		var oDNDMenu = getObj('dv_DND_select_'+sExt);
		var oDNDInput = getObj('dv_DND_input_'+sExt);
		// the device info may have come down, but the UI doesn't get built out until
		// the node info is requested - skip UI updates - this will be recalled once
		// the node info is received.
		if (!oNameInput && !oDNDMenu && !oDNDInput)
			return
			
		// name 
		oNameInput.value = oDevice.selectSingleNode('Name').text;
			
		//////// DND...
		var oDevStatusNode = oDevice.selectSingleNode('DeviceStatus/DEVICE_STATUS');
		var sDNDText = oDevStatusNode.selectSingleNode('PrimaryMessage').text;
		var sOptText = oDevStatusNode.selectSingleNode('SecondaryMessage').text;
		oDNDInput.value = sOptText;
		if (sDNDText)
		{
			SetSelectIndex(oDNDMenu, sDNDText, 1);
			oDNDInput.disabled=0;
		}
		else
		{
			oDNDInput.disabled=1;
			oDNDMenu.selectedIndex=0;
		}
		var oIcon = getObj('rowDV'+sExt).firstChild.firstChild
		oIcon.src = (sDNDText) ? 'img/iKeysetDND.gif' : 'img/iKeyset.gif';
		
		////// FORWARDING...
		var oFWDNode = oDevice.selectSingleNode('ForwardingSettings/FORWARDING');
		var oFWDMenu = getObj('dv_FWD_select_'+sExt);
		var oFWDInput = getObj('dv_FWD_input_'+sExt);
		var sNodeColonRE = new RegExp('[\\w]+:');
		oFWDInput.value = oFWDNode.selectSingleNode('ForwardDestination').text.replace(sNodeColonRE,'');
		if (boolVal(oFWDNode.selectSingleNode('ForwardOn')))
		{
			var sFWDType = oFWDNode.selectSingleNode('ForwardType').text;
			SetSelectIndex(oFWDMenu, sFWDType, 0);
			oFWDInput.disabled=0;
		}	
		else
		{
			oFWDInput.disabled=1;
			oFWDMenu.selectedIndex=0;
		}
		// Primary device radio
		if (DeviceFlagIsEnabled(oDevice, DEVICE_FLAG_IS_PRIMARY))
			getObj('rowDV'+sExt).lastChild.firstChild.checked=true;
			
		// if the node for this device is down disable all input elements
		if (oParentNode && !boolVal(oParentNode.selectSingleNode('NodeNameElements//Active')))
			ToggleDeviceInterfaceElements(oDevice, true);
		else
		{
			// check for DND support
			if (!DeviceSupportsFeatureCode(oDevice, 'DND OAI BASIC') && 
				!DeviceSupportsFeatureCode(oDevice, 'DND OAI EXTENDED'))
			{
				oDNDMenu.disabled 	= true;
				oDNDInput.disabled 	= true;
			}
			// check for System Forward support
			if (!DeviceSupportsFeatureCode(oDevice, 'FWD ALL CALLS OAI') && 
				!DeviceSupportsFeatureCode(oDevice, 'FWD IF NO ANSWER OAI') && 
				!DeviceSupportsFeatureCode(oDevice, 'FWD IF BUSY OAI') && 
				!DeviceSupportsFeatureCode(oDevice, 'FWD IF NA/BUSY OAI'))
			{
				oFWDMenu.disabled 	= true;
				oFWDInput.disabled 	= true;
			}
		}
		
		oDevice = (b_UPDATE_ALL) ? oDevice.nextSibling : null;
	}
}

// FWD ALL CALLS OAI
// FWD IF NO ANSWER OAI
// FWD IF BUSY OAI
// FWD IF NA/BUSY OAI
// oDevNode.firstChild.selectSingleNode('StationType').text='-1'

function DeviceSupportsFeatureCode(oDevice, feature)
{
	var oCfgDevice, oCfgCode, b_IS_INCLUSIVE=false;
	if (oDevice)
		oCfgDevice = oRoot.selectSingleNode(Insert(oDevice.selectSingleNode('StationType').text, 'FEATURE_CODE_SUPPORT/*/DEVICE[@station_type="{0}"]'));
	if (oCfgDevice)
	{
		b_IS_INCLUSIVE = (oCfgDevice.getAttribute('format')=='inclusive');
		oCfgCode = oCfgDevice.selectSingleNode(Insert(feature, 'FC[.=\"{0}\"]'));
	}
	if (oCfgCode)
		return b_IS_INCLUSIVE;
	// if there's no feature code return the opposite of the b_IS_INCLUSIVE value
	else if (oCfgDevice)
		return !b_IS_INCLUSIVE;

	return true;
}

function DeviceFlagIsEnabled(oDevice, btFLAG)
{
	var nFlags = eval(oDevice.selectSingleNode('Flags').text);
	return (nFlags & btFLAG);
}

function ToggleDeviceInterfaceElements(oDevice, b_DISABLED)
{
	var ext = oDevice.selectSingleNode('Extension').text;
	// make sure the row currently exists in the table
	if (getObj('rowDV'+ext))
	{
		getObj('dv_name_'+ext).disabled 		= b_DISABLED;
		getObj('dv_DND_select_'+ext).disabled	= b_DISABLED;
		getObj('dv_DND_input_'+ext).disabled	= b_DISABLED;
		getObj('dv_FWD_select_'+ext).disabled	= b_DISABLED;
		getObj('dv_FWD_input_'+ext).disabled	= b_DISABLED;
		getObj('dv_primary_'+ext).disabled 		= b_DISABLED;
		var oFCIcon 	= getObj('rowDV'+ext).lastChild.lastChild.firstChild;
		var oPassIcon 	= getObj('rowDV'+ext).lastChild.lastChild.firstChild.nextSibling;
		oFCIcon.src		= (b_DISABLED) ? 'img/iFCArrowDnDISABLED.gif' : 'img/iFCArrowDn.gif';
		if (oFCIcon.style.cursor)
			oFCIcon.style.cursor = (b_DISABLED) ? 'default' : 'hand';
		oPassIcon.src	= (b_DISABLED) ? 'img/iSetPassDISABLED.gif' : 'img/iSetPass.gif';
		if (oPassIcon.style.cursor)
			oPassIcon.style.cursor = (b_DISABLED) ? 'default' : 'hand';
	}
}

function TextChange()
{
	var oEl = window.event.srcElement, oOldObj, oNewObj, child_path, value, oSelect;
	// changes to DND or Forwarding select boxes or text fields
	var re = new RegExp('[^0-9]*', 'g')
	var ext = oEl.id.replace(re, '');
	
	if (oEl.className=='dv_select' || oEl.className=='dv_extra_text')
	{
		var obj_prop = oEl.prop;
		// *** SELECT BOX UPDATE ***
		if (oEl.className=='dv_select')
		{
			// enable or disable text box
			getObj('dv_'+obj_prop+'_input_'+ ext).disabled = !(oEl.selectedIndex > 0);
			obj_path = (obj_prop=='FWD') ? '/ForwardingSettings/FORWARDING' : '/DeviceStatus/DEVICE_STATUS';
		}
		// *** TEXT FIELD UPDATE ***
		else if (oEl.className=='dv_extra_text')
			obj_path = (obj_prop=='FWD') ? '/ForwardingSettings/FORWARDING' : '/DeviceStatus/DEVICE_STATUS';

		// select either the DEVICE_STATUS node or the FORWARDING node
		oNewObj = oDevNode.selectSingleNode('DEVICE[Extension="'+ ext +'"]' + obj_path);
		oOldObj = oNewObj.cloneNode(true);
		
		var oSelect = getObj('dv_'+obj_prop+'_select_'+ ext);
		var oInput 	= getObj('dv_'+obj_prop+'_input_'+ ext);
		
		if (obj_prop=='DND')
		{
			if (oEl.className=='dv_select')
			{
				oInput.value='';
				oNewObj.selectSingleNode('SecondaryMessage').text = '';
				var oDNDIcon = oEl.parentElement.parentElement.firstChild.firstChild;
				oDNDIcon.src = (oInput.disabled) ? 'img/iKeyset.gif' : 'img/iKeysetDND.gif';
			}
			oNewObj.selectSingleNode('PrimaryMessage').text 	= oSelect.value;
			oNewObj.selectSingleNode('SecondaryMessage').text 	= oInput.value;
		}
		
		if (obj_prop=='FWD')
		{	
			if (oEl.className=='dv_select' && oEl.selectedIndex && !IsValid(getObj('dv_FWD_input_'+ ext)))
				return;
			else
			{
				// if the fowarding has been turned off, clear out the destination number
				if (oEl.className=='dv_select' && !oEl.selectedIndex)
					oInput.value='';

				oNewObj.selectSingleNode('ForwardOn').text 			= (oSelect.selectedIndex) ? 'TRUE' : 'FALSE';
				oNewObj.selectSingleNode('ForwardType').text 		= oSelect.value;
				oNewObj.selectSingleNode('ForwardDestination').text = oInput.value;
			}
		}
			
	}
	// *** DEVICE NAME EDIT FIELD UPDATE ***
	else if (oEl.className=='dv_name')
	{
		var new_name = oEl.value;
		oNewObj = oDevNode.selectSingleNode('DEVICE[Extension="'+ oEl.id.replace('dv_name_', '') +'"]');
		oOldObj = oNewObj.cloneNode(true);
		// check for an existing node with the new name, that is not the edited device
		var account_id =  oActNode.selectSingleNode('.//UniqueID').text;
		var oMatchNameNode = FindExistingNodeValue(oDevNode, 'Name', new_name);
		if (oMatchNameNode && (account_id != oMatchNameNode.selectSingleNode('OwnerAccount').text || oMatchNameNode.selectSingleNode('Extension').text == oNewObj.selectSingleNode('Extension').text))
			oMatchNameNode = null;
			
		if (!oMatchNameNode)
		{
			oNewObj.selectSingleNode('Name').text = new_name;
			var oCurDeviceCompStatus = oCompStatusNode.selectSingleNode('COMPOSITE_STATUS[LocationType="1" and LocationNumber="'+ oNewObj.selectSingleNode('NodeID').text +":"+ oNewObj.selectSingleNode('Extension').text +'"]');
			if (oCurDeviceCompStatus)
			{
				DisplayAccountStatus();
				table['CS'].refresh();
			}
		}
		else
		{
			oEl.value = oNewObj.selectSingleNode('Name').text;
			Dialog(text('DLG/DV/MCH_NM'),0);
			oNewObj=null;
		}
	}
	if (oNewObj)
	{
		CallControlMethod('EditXMLObject', oOldObj.cloneNode(true), oNewObj.cloneNode(true));
		if (oStepsNode.selectSingleNode('STEP[LocationType="1" and Destination="'+oOldObj.selectSingleNode('NodeID').text+':'+ext+'"]'))
			UpdateRoutingRuleTables();
	}
}

var DEVICE_FLAG_ENABLED 	= new Number(0x0001);
var DEVICE_FLAG_IS_PRIMARY 	= new Number(0x0002);

function SetPrimaryDevice(oRadio)
{
	var oNew = oDevNode.selectSingleNode('DEVICE[Extension="'+oRadio.extension+'"]');
	var oOld = oNew.cloneNode(true);
	var oFlags = oNew.selectSingleNode('Flags');
	var nFlags = parseFloat(oFlags.text);
	oFlags.text = nFlags |= DEVICE_FLAG_IS_PRIMARY;
	CallControlMethod('EditXMLObject', oOld, oNew);
}

function ToggleDeviceFeatureCodes(oIcon, oRow)
{
	var img_src = GetImgSrc(oIcon);
	var i=0, b_DISPLAY_FEATURE_CODES = (img_src == 'iFCArrowDn');
	var oRowsParent = oRow.parentElement;
	var extension = oRow.UniqueID;
	var oDevice = oDevNode.selectSingleNode('DEVICE[Extension="'+ extension +'"]');
	var node_id = oDevice.selectSingleNode('NodeID').text;
	
	if (b_DISPLAY_FEATURE_CODES && NodeIsDown(node_id))
	{
		Dialog(text('DLG/NODE_DOWN'), 0);
		return;
	}
	
	while (oRowsParent.children[i])
	{
		if (oRow != oRowsParent.children[i] && oRowsParent.children[i].id)
			(b_DISPLAY_FEATURE_CODES)? Hide(oRowsParent.children[i].id) : Show(oRowsParent.children[i].id);
		else if (oRow == oRowsParent.children[i] && oRow.style.display=='none')
			Show(oRow.id);
		i++;
	}
	if (b_DISPLAY_FEATURE_CODES)
	{
		oIcon.src = 'img/iFCArrowUp.gif';
		if (getObj('dv_feature_codes').Node != node_id || getObj('dv_feature_codes').Extension != extension)
		{
			getObj('dv_feature_codes').Node = node_id;
			getObj('dv_feature_codes').Extension = extension;
			UpdateFeatureCodeDisplay(boolVal(oDevice.selectSingleNode('PBXAdmin')));
		}
		Show('dv_feature_codes');
		table['DV'].body.style.height = '57px';
	}
	else
	{
		oIcon.src = 'img/iFCArrowDn.gif';
		Hide('dv_feature_codes');
		table['DV'].body.style.height = '';
	}
}

function UpdateFeatureCodeDisplay(b_ISADMIN)
{
	// toggle the Admin tab's display dependant on the device's PBXAdmin flag
	tab['dv_feature_codes'].head.children[1].style.display = (b_ISADMIN) ? '' : 'none';
	table['FCUSER'].refresh();
	table['FCADMN'].refresh();
	table['FCFAVS'].refresh();
}

function HideDeviceFeatureCodes()
{
	var deviceTable = getObj('DV').firstChild;
	var child = deviceTable.firstChild.nextSibling.firstChild;
	while (!child.id || child.style.display=='none')
		child = child.nextSibling;
	child.lastChild.lastChild.firstChild.click();
}

function ExecuteFeatureCodeFromDeviceView(code)
{
	ExecuteFeatureCode(code, getObj('dv_feature_codes').Node, getObj('dv_feature_codes').Extension);
}

var emerg_call_timer;

//ExecuteFeatureCode, 370, ^1^1:1003
//ExecuteGenericCommand(ExecuteFeatureCode, 312, ^1^1:1003)

function ExecuteFeatureCodeOnCall(description, call_id)
{
	if (!call_id)
		call_id = GetHighlightedCallID();
		
	var oCall = oCallListNode.selectSingleNode('.//*[CallID="'+call_id+'"]');
	if (oCall)
	{
		var node_id = oCall.selectSingleNode('NodeID').text;
		var ext = oCall.selectSingleNode('Extension').text;
		var oFeatureCode = oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID="'+node_id+'"]/FeatureCodes//FEATURE_CODE[Description="'+description+'"]');
		if (oFeatureCode)
			ExecuteFeatureCode(oFeatureCode.selectSingleNode('Code').text, node_id, ext, call_id);
	}
}

function ExecuteFeatureCode(code, node_id, ext, call_id)
{
	var del_nodeid_nodecolonext = DelimitList(new Array(node_id, (node_id+':'+ext)));
	
	if (NodeIsDown(node_id))
		Dialog(text('DLG/NODE_DOWN'), 0);
	else
	{
		var description = oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID="'+node_id+'"]/FeatureCodes//FEATURE_CODE[Code="'+code+'"]/Description').text;
		// check if feature code exists in call id required list of xConfig
		var oFeatCodeRequiresCallID = oConfig.selectSingleNode(Insert(description, 'CONFIG/FEATURE_CODES_REQUIRING_CALL_ID/FC[.="{0}"]'))
		// if no call id has been explicitly passed in, choose the first connected call
		if (!call_id && oFeatCodeRequiresCallID)
		{
			var oCall = oCallListNode.selectSingleNode(Insert(ext, '*[Extension="{0}" and State="C"]'));
			if (oCall)
				call_id = oCall.selectSingleNode('CallID').text;
			else
			{
				Dialog(Insert(ext, text('DLG/DV/NO_FC_CALL')),0);
				return;
			}
		}
		CallControlMethod('ExecuteFeatureCode', code, del_nodeid_nodecolonext, call_id);
	}
	
	/*	
	else if (code=='911')
	{
		emerg_call_timer = window.setTimeout("EmergencyCall('"+code+"', '"+del_nodeid_nodecolonext+"')", 3000);
		var ret_vals = ParseDelimitedList(Dialog(text('DLG/EMGCALL'),1,null,null,true));
		if (!eval(ret_vals[0]))
		{
			window.clearTimeout(emerg_call_timer);
			emerg_call_timer=null;
			alert('cancelled 911 call');
		}
		else
		{
			window.clearTimeout(emerg_call_timer);
			emerg_call_timer=null;
			EmergencyCall(code, del_nodeid_nodecolonext);
		}
	}	
*/
}

function EmergencyCall(code, del_nodeid_nodecolonext)
{
	//CallControlMethod('DIAG', 'executing 911 call');
	//alert('executing 911 call');
	//CallControlMethod('ExecuteFeatureCode', code, del_nodeid_nodecolonext, null);
}

function RequestDevicesList(unique_id)
{
	var oContact = oABNode.selectSingleNode('CONTACT[UniqueID="'+unique_id+'"]');
	if (oDevNode.selectNodes('DEVICE[OwnerAccount="'+oContact.selectSingleNode('LinkParameter').text+'"]').length == 0)
		CallControlMethod('GetObjectList', GetTemplate('DEVICE'), oContact.selectSingleNode('LinkParameter').text);
}

// ****************************************************
// **********************  NODES  *********************
// ****************************************************

function GetNodeInfo()
{
	if (!oLogonNode.selectSingleNode('RequestedNodes'))
		AddNode(oLogonNode, 'RequestedNodes');
	
	var children = oDevNode.selectNodes('DEVICE[OwnerAccount = /R/ACCOUNT//UniqueID]'), i=0;
	while (children[i])
	{
		var node_id = children[i].selectSingleNode('NodeID').text;
		if (node_id && !oLogonNode.selectSingleNode('RequestedNodes/Node[@id="'+node_id+'"]'))
		{
			var oRequestedNode = oSys.createElement('Node');
			oRequestedNode.setAttribute('id', node_id);
			oLogonNode.selectSingleNode('RequestedNodes').appendChild(oRequestedNode);
					
			GetSynchronousNode(node_id);

			var request_feature_code = GetTemplate('FEATURE_CODE');
			request_feature_code.selectSingleNode('NodeID').text = node_id;
			var oList = CallControlMethod('GetObjectListSynch', request_feature_code);
			if (oList.selectNodes('LIST//FEATURE_CODE')[0])
				XMLObjectListBlock('FEATURE_CODE', oList);
			else
				oRequestedNode.setAttribute('featureCodes', 'true');
		}
		i++;
	}
	
	var oCurRequestNode = oLogonNode.selectSingleNode('RequestedNodes').firstChild;
	while (oCurRequestNode && oCurRequestNode.getAttribute('node')=='true' && oCurRequestNode.getAttribute('featureCodes')=='true')
		oCurRequestNode = oCurRequestNode.nextSibling;
	
	if (!oCurRequestNode || !oDevNode.hasChildNodes())
	{
		SetReceivedNodeInfo();
		CheckForNewAccountDevices();
		return;
	}
}

function GetSynchronousNode(node_id)
{
	// prevent requesting a duplicate node - one may exist from processing contacts
	if (!oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID="'+node_id+'"]'))
	{
		var request_node = GetTemplate('NODE');
		request_node.selectSingleNode('NodeNameElements//NodeID').text = node_id;
		var oXMLNodeDoc = CallControlMethod('GetObjectSynch', request_node.cloneNode(true));
		if (oXMLNodeDoc)
			AddXMLObject(oXMLNodeDoc.cloneNode(true));
		// temporary - test on add contact
		// prevent multiple node requests for nodes not found
		else
		{
			request_node.selectSingleNode('NodeNameElements//Active').text = 'false';
			var oNodeDoc = new ActiveXObject("Msxml.DOMDocument");
			oNodeDoc.appendChild(request_node.cloneNode(true));
			AddXMLObject(oNodeDoc);
		}
	}
	var oRequestNode = oLogonNode.selectSingleNode('RequestedNodes/Node[@id="'+node_id+'"]');
	if (oRequestNode)
		oRequestNode.setAttribute('node', 'true');
}

function SetReceivedNodeInfo()
{
	bt_SESSION_STATUS |= _RECEIVED_NODE_LIST;
	bt_SESSION_STATUS |= _RECEIVED_FEATURE_CODES;
	
	CheckLogonStatus();
}


// ****************************************************
// ***************  COMPOSITE STATUS  *****************
// ****************************************************

function UpdateCompositeStatusSelect(oSelect)
{
	var oCurOpt = oSelect.options[oSelect.selectedIndex];
	var oNumInput = getObj('cs_location_number');
	if (oCurOpt.type==1)
	{
		oNumInput.value = FormatPhoneNumber(oCurOpt.extension);
		oNumInput.disabled = true;
	}
	else if (oCurOpt.type>1)
	{
		oNumInput.value = FormatPhoneNumber(oActNode.selectSingleNode('.//CONTACT/'+oCurOpt.property).text);
		oNumInput.disabled = true;
	}
	else
	{
		oNumInput.value = '';
		oNumInput.disabled = false;
	}
}

function ShowCompositeStatusForm()
{
	var oForm = getObj('CSFM');
	oForm.firstChild.innerText = (oForm.type=='add') ? text('CS/ADD') : text('CS/EDI');
	Show('CSFM');
	Hide('tableCS');
	SetButtons('CSFM');
	SetFocus('cs_description');
}

function HighlightRow()
{
	if (curRow && curRow.id != "")
	{
		var cur_row = getObj(curRow.id);
		if (cur_row)
			cur_row.style.backgroundColor = HIGHLIGHTED_ROW_COLOR;
		
	}
}

function HideCompositeStatusForm()
{
	var oForm = getObj('CSFM');
	if (oForm.style.display=='')
	{
		Hide('CSFM');
		getObj('CSFM').type=null;
		getObj('CSFM').UniqueID=null;
		Show('tableCS');
		SetButtons('CS');
	}
	HighlightRow();
}

function SetFocus(str)
{
	if (getObj(str))
		window.setTimeout('HandleFocus("'+str+'")', 250);
}

function HandleFocus(str)
{
	var obj = getObj(str);
	if (obj)
		obj.focus();
}

/*
<COMPOSITE_STATUS>
	<TenantGroup></TenantGroup>
	<Owner></Owner>
	<Description></Description>
	<Available>TRUE</Available>
	<DN></DN>
	<LocationType>-842150451</LocationType>
	<LocationName></LocationName>
	<LocationNumber></LocationNumber>
	<DeviceSettings>
		<LIST>
			<ObjectsType></ObjectsType>
			<NumberOfObjects>0</NumberOfObjects>
		</LIST>
	</DeviceSettings>
	<MsnStatus></MsnStatus>
</COMPOSITE_STATUS>


   LOCATION_TYPE_CUSTOM       = 0;
   LOCATION_TYPE_DEVICE       = 1;
   LOCATION_TYPE_WORK_1       = 2;
   LOCATION_TYPE_WORK_2       = 3;
   LOCATION_TYPE_WORK_MOBILE  = 4;
   LOCATION_TYPE_WORK_IP      = 5;
   LOCATION_TYPE_HOME_1       = 6;
   LOCATION_TYPE_HOME_2       = 7;
   LOCATION_TYPE_HOME_MOBILE  = 8;
   LOCATION_TYPE_HOME_IP      = 9;

*/
function AddCompositeStatus()
{
	if (AnyInactiveNodesForMyDevices())
	{
		Dialog(text('DLG/NODE_DOWN'), 0);
		return;
	}
	getObj('CSFM').type = 'add';
	BuildDiv('CSFM', oRoot);
	ShowCompositeStatusForm();
}

function EditCompositeStatus(sDN)
{
	if (AnyInactiveNodesForMyDevices())
	{
		Dialog(text('DLG/NODE_DOWN'), 0);
		return;
	}
	BuildDiv('CSFM', oRoot);
	var oForm = getObj('CSFM');
	oForm.type = 'edit';
	oForm.UniqueID = sDN;
	var oLocationNameSelect = getObj('cs_location_name');
	var oMessengerSelect = getObj('cs_messenger_status');
	var location_type, location_name, location_num;
	var oCurObj = oCompStatusNode.selectSingleNode('COMPOSITE_STATUS[DN="'+sDN+'"]');
	getObj('cs_description').value 	= oCurObj.selectSingleNode('Description').text;
	getObjects('cs_availibility')[boolVal(oCurObj.selectSingleNode('Available'))?0:1].checked = true;
	location_type = oCurObj.selectSingleNode('LocationType').text;
	location_name = (location_type=='0') ? Insert(text('CS/CUST'), '[ {0} ]') : oCurObj.selectSingleNode('LocationName').text;
	switch (location_type)
	{
		case '0':
			location_num = oCurObj.selectSingleNode('LocationNumber').text; 
			SetSelectIndex(oLocationNameSelect, location_type, 2, 'type');
			break;
			
		case '1':
			location_num = oCurObj.selectSingleNode('LocationNumber').text;
			SetSelectIndex(oLocationNameSelect, oCurObj.selectSingleNode('LocationNumber').text, 2, 'node_colon_extension');
			break;
		
		default :
			location_num = oActNode.selectSingleNode('.//'+oRoot.selectSingleNode('CONTACT_FIELDS/FIELD[@locType="'+location_type+'"]').getAttribute('name')).text;
			SetSelectIndex(oLocationNameSelect, location_type, 2, 'type');
			break;
	}
	getObj('cs_location_number').value = FormatPhoneNumber(RemoveNodePrefix(location_num));
	getObj('cs_location_number').disabled = (oLocationNameSelect.options[oLocationNameSelect.selectedIndex].type>0) ? true : false;
	if (b_MARGARITA_LICENSED)
		SetSelectIndex(oMessengerSelect, oCurObj.selectSingleNode('MsnStatus').text, 0);
	var b_DYNAMIC_STATUS = boolVal(oCurObj.selectSingleNode('DynamicStatus'));
	getObj('cs_dynamic_status').checked = b_DYNAMIC_STATUS;
	if (b_DYNAMIC_STATUS)
		ToggleSecondaryDNDMessages(getObj('cs_dynamic_status'));
	var children = oDevNode.selectNodes('DEVICE[OwnerAccount = "'+oActNode.selectSingleNode('.//UniqueID').text+'"]'),i=0;
	while (children[i])
	{
		var sExt = children[i].selectSingleNode('Extension').text;
		var oCurDeviceStatusChild = oCurObj.selectSingleNode('DeviceSettings/LIST//DEVICE_STATUS[Extension="'+ sExt +'"]');
		if (oCurDeviceStatusChild)
		{
			var oPrimaryMessageSelect = getObj('cs_dnd_primary_'+sExt);
			SetSelectIndex(oPrimaryMessageSelect, oCurDeviceStatusChild.selectSingleNode('PrimaryMessage').text, 1);
			getObj('cs_dnd_secondary_'+sExt).value =  oCurDeviceStatusChild.selectSingleNode('SecondaryMessage').text;
			getObj('cs_dnd_secondary_'+sExt).disabled = b_DYNAMIC_STATUS;
		}
		i++;
	}
	
	var oSharedDNDSelect = getObj('cs_dnd_primary_shared');
	if (oSharedDNDSelect)
	{
		var oSharedDeviceSetting = oCurObj.selectSingleNode('DeviceSettings/LIST//DEVICE_STATUS[Extension="Shared"]');
		if (oSharedDeviceSetting)
		{
			SetSelectIndex(oSharedDNDSelect, oSharedDeviceSetting.selectSingleNode('PrimaryMessage').text, 0);
			getObj('cs_dnd_secondary_shared').value = oSharedDeviceSetting.selectSingleNode('SecondaryMessage').text;
		}
		// in the case where the composite status does not contain a Shared setting, add one manually
		// or an error will be thrown above tring to access the Primary Message node
		else
		{
			var oSharedDeviceSetting = oCurObj.selectSingleNode('DeviceSettings/LIST//DEVICE_STATUS[0]').cloneNode(true);
			oSharedDeviceSetting.selectSingleNode('Extension').text = 'Shared';
			oSharedDeviceSetting.selectSingleNode('PrimaryMessage').text = '';
			oSharedDeviceSetting.selectSingleNode('SecondaryMessage').text = '';
			AddChildNodeToListObject(oCurObj.selectSingleNode('DeviceSettings'), oSharedDeviceSetting);
		}
	}

	ShowCompositeStatusForm();
}

function SaveCompositeStatus()
{
	var oForm = getObj('CSFM'), oCSObj;
	var type = oForm.type;
	var oLocationNameSelect = getObj('cs_location_name');
	var oMessengerSelect = getObj('cs_messenger_status');
	var oSharedDNDSelect = getObj('cs_dnd_primary_shared');
	if (type == 'add')
	{
		oCSObj = GetTemplate('COMPOSITE_STATUS');
		var oDeviceStatusTemplate = GetTemplate('DEVICE_STATUS');
		oCSObj.selectSingleNode('TenantGroup').text = oActNode.selectSingleNode('.//TenantGroup').text;
		oCSObj.selectSingleNode('Owner').text 		= oActNode.selectSingleNode('.//UniqueID').text;
		
		var oDeviceSettings = oCSObj.selectSingleNode('DeviceSettings');
		oDeviceSettings.selectSingleNode('.//ObjectsType').text = 'DEVICE_STATUS';
		var children = oDevNode.selectNodes('DEVICE[OwnerAccount = "'+oActNode.selectSingleNode('.//UniqueID').text+'"]'), i=0;
		// add device status nodes for associated devices
		while (children[i])
		{
			addDeviceStatusNode(oDeviceSettings, oDeviceStatusTemplate.cloneNode(true), children[i].selectSingleNode('NodeID').text, children[i].selectSingleNode('Extension').text);
			i++;
		}
		// add device status node for shared devices
		if (oSharedDNDSelect)
			addDeviceStatusNode(oDeviceSettings, oDeviceStatusTemplate.cloneNode(true), '', 'Shared');
	}
	else if (type == 'edit')
	{
		oCSObj = oCompStatusNode.selectSingleNode('COMPOSITE_STATUS[DN="'+oForm.UniqueID+'"]');
		oOldCSObj = oCSObj.cloneNode(true);
	}
	if (oCSObj)
	{
		var oMatchingObj = FindExistingNodeValue(oCompStatusNode, 'Description', getObj('cs_description').value);
		if (!IsValid(getObj('cs_description')))
		{
			Dialog(text('DLG/CS/NO_DES'),0);
			return;
		}
		else if (oMatchingObj && (type == 'add' || ( type == 'edit' && oCSObj.selectSingleNode('DN').text != oMatchingObj.selectSingleNode('DN').text)))
		{
			Dialog(text('DLG/CS/MATCH_DES'),0);
			return;
		}
		
		var sPrevCSDescription = oCSObj.selectSingleNode('Description').text;
		oCSObj.selectSingleNode('Description').text	= getObj('cs_description').value;
		oCSObj.selectSingleNode('Available').text	= (getObjects('cs_availibility')[0].checked) ? 'true' : 'false';
		var opt = oLocationNameSelect.options[oLocationNameSelect.selectedIndex];
		// check for valid location type
		if (!IsNum(opt.type))
		{
			Dialog(text('DLG/CS/CHS_LOCNM'), 1);
			SetFocus(oLocationNameSelect.id);
			return false;
		}
		// check for valid custom location
		else if (parseFloat(opt.type) == 0 && !StripPhoneNumber(getObj('cs_location_number').value))
		{
			Dialog(text('DLG/CS/VAL_NUM'), 0);
			SetFocus('cs_location_number');
			return false;
		}
		// check that the personal info location index contains a valid number
		else if (parseFloat(opt.type) > 1 && !CheckForValidLocationInObject(oActNode, oLocationNameSelect, opt.type))
			return false;
			
		oCSObj.selectSingleNode('LocationName').text	= '';
		var sLocNum='', sLocType = opt.type;
		switch (sLocType)
		{
			case '0': sLocNum = StripPhoneNumber(getObj('cs_location_number').value); break;
			case '1': sLocNum = opt.node_colon_extension; break;
		}

		oCSObj.selectSingleNode('LocationType').text	= sLocType;
		oCSObj.selectSingleNode('LocationNumber').text	= sLocNum;
		oCSObj.selectSingleNode('DynamicStatus').text	= (getObj('cs_dynamic_status').checked) ? 'true' : 'false';
		
		if (b_MARGARITA_LICENSED)
			oCSObj.selectSingleNode('MsnStatus').text 	= oMessengerSelect.options[oMessengerSelect.selectedIndex].value;
		var children = oCSObj.selectNodes('DeviceSettings/LIST//DEVICE_STATUS[Extension!="Shared"]'), i=0;
		while (children[i])
		{
			var ext = children[i].selectSingleNode('Extension').text;
			var oPrimaryMessageSelect = getObj('cs_dnd_primary_'+ext);
			if (oPrimaryMessageSelect)
			{
				children[i].selectSingleNode('PrimaryMessage').text 	= (oPrimaryMessageSelect.selectedIndex) ? oPrimaryMessageSelect.options[oPrimaryMessageSelect.selectedIndex].text : '';
				children[i].selectSingleNode('SecondaryMessage').text 	= getObj('cs_dnd_secondary_'+ext).value;
			}
			i++;
		}

		if (oSharedDNDSelect)
		{
			var oSharedStatus = oCSObj.selectSingleNode('DeviceSettings/LIST//DEVICE_STATUS[Extension="Shared"]');
			oSharedStatus.selectSingleNode('PrimaryMessage').text = oSharedDNDSelect.options[oSharedDNDSelect.selectedIndex].value;
			oSharedStatus.selectSingleNode('SecondaryMessage').text = getObj('cs_dnd_secondary_shared').value;
		}
		
		if (type == 'add')
		{
			oCompStatusNode.appendChild(oCSObj);
			CallControlMethod('AddXMLObject', oCSObj);
		}
		else if (type == 'edit')
		{
			
			CallControlMethod('EditXMLObject', oOldCSObj, oCSObj);
			//var oActStatusNode = oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS');
			if (oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS/CurrentCompositeStatus').text == sPrevCSDescription)
			{
				var oOldStatusNode = oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS').cloneNode(true);

				oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS/CurrentCompositeStatus').text 	= oCSObj.selectSingleNode('Description').text;
				var new_dynamic_status = (boolVal(oCSObj.selectSingleNode('DynamicStatus'))) ? PromptForDynamicStatus() : '';
				oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS/CurrentDynamicStatus').text 		= new_dynamic_status;
				oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS/Available').text 				= oCSObj.selectSingleNode('Available').text;
				CallControlMethod('EditXMLObject', oOldStatusNode, oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS').cloneNode(true));
				
				UpdateStatusListItem(oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS').cloneNode(true));
			}
		}

		table['CS'].refresh();
		var oCompositeStatusSelect = getObj('AccountCompositeStatusSelect');
		if (oCompositeStatusSelect.selectedIndex != -1 || (oCompositeStatusSelect.options && (sPrevCSDescription == oCompositeStatusSelect.options[oCompositeStatusSelect.selectedIndex].value)))
			DisplayAccountStatus();

	}
	HideCompositeStatusForm();
	
	function addDeviceStatusNode(device_settings, status, node, ext)
	{
		if (node)
			status.selectSingleNode('NodeID').text 	= node;
		if (ext)
			status.selectSingleNode('Extension').text = ext;
		AddChildNodeToListObject(device_settings, status);
	}
}

function ToggleSecondaryDNDMessages(oCheckbox)
{
	var disabled = oCheckbox.checked;
	var oSharedSecondaryTextbox = getObj('cs_dnd_secondary_shared');
	if (oSharedSecondaryTextbox)
	{
		oSharedSecondaryTextbox.disabled = disabled;
		if (disabled)
			oSharedSecondaryTextbox.value = '';
	}
	var child = oDevNode.firstChild;
	while (child)
	{
		var oTextbox = getObj('cs_dnd_secondary_'+child.selectSingleNode('Extension').text);
		if (oTextbox)
		{
			oTextbox.disabled = disabled;
			if (disabled)
				oTextbox.value = '';
		}
		child = child.nextSibling;
	}
}

function UpdateCompositeStatusForAccount(oSelect)
{
	var description = oSelect.options[oSelect.selectedIndex].value;
	var oCSObj = oCompStatusNode.selectSingleNode('COMPOSITE_STATUS[Description="'+ description +'"]');
	if (oCSObj)
	{
		var oActStatusNode = oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS');
		var oOldStatusNode = oActStatusNode.cloneNode(true);
		oActStatusNode.selectSingleNode('CurrentCompositeStatus').text 	= oCSObj.selectSingleNode('Description').text;
		oActStatusNode.selectSingleNode('CurrentDynamicStatus').text 	= (boolVal(oCSObj.selectSingleNode('DynamicStatus'))) ? PromptForDynamicStatus() : '';
		oActStatusNode.selectSingleNode('Available').text 				= oCSObj.selectSingleNode('Available').text;

		CallControlMethod('EditXMLObject', oOldStatusNode, oActStatusNode.cloneNode(true));
		
		DisplayAccountStatus();
		UpdateStatusListItem(oActStatusNode);
	}
}

function CheckForSelectedDynamicStatus(oSelect)
{
	if (window.event.ctrlKey)
	{
		var oSelect = getObj('AccountCompositeStatusSelect');
		var description = oSelect.options[oSelect.selectedIndex].value;
		var oCSObj = oCompStatusNode.selectSingleNode('COMPOSITE_STATUS[Description="'+ description +'"]');
		if (oCSObj && boolVal(oCSObj.selectSingleNode('DynamicStatus')) && (oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS/CurrentCompositeStatus').text == description))
		{
			UpdateCompositeStatusForAccount(oSelect);
			//setTimeout("UpdateCompositeStatusForAccount(getObj('AccountCompositeStatusSelect'))" , 10);
			window.event.cancelBubble=true;
			return false;
		}
	}
}

function PromptForDynamicStatus()
{
	var ret_vals = ParseDelimitedList(Dialog(text('CS/DYN_TEXT'),12));
	if (ret_vals && ret_vals[0] && eval(ret_vals[0]) && ret_vals[1])
		return ret_vals[1];
	return '';
}

function CreateTemporaryCompositeStatus()
{
	var obj_setup = new Array(new Array('checked', 'default'), new Array('focus', 'cs_phone'));
	var sReturnValues = Dialog(text('DLG/CS/TMP_PRMT'), 5, null, obj_setup);
	var tVals = ParseDelimitedList(sReturnValues), b_NEW_CS=0, oOldTempCSObj;
	
	
	if (tVals && eval(tVals[0]))
	{
		// if no phone number was provided
		if (!tVals[2])
		{
			Dialog(text('DLG/CS/VAL_NUM'), 0);
			CreateTemporaryCompositeStatus();
		}
		else
		{
			var sTempDescription = (eval(tVals[1])) ? config('TEMP_COMPOSITE_STATUS_AVAILABLE') : config('TEMP_COMPOSITE_STATUS_UNAVAILABLE');
			var oTempCSObj = oCompStatusNode.selectSingleNode('COMPOSITE_STATUS[Description="'+sTempDescription+'"]');
			if (!oTempCSObj)
			{
				b_NEW_CS=1;
				oTempCSObj = GetTemplate('COMPOSITE_STATUS');
			}
			else
				oOldTempCSObj = oTempCSObj.cloneNode(true);
	
			oTempCSObj.selectSingleNode('Description').text 	= sTempDescription;
			oTempCSObj.selectSingleNode('Available').text 		= tVals[1];
			oTempCSObj.selectSingleNode('LocationType').text	= '0';
			oTempCSObj.selectSingleNode('LocationName').text	= text('CS/TEMP');
			oTempCSObj.selectSingleNode('LocationNumber').text	= StripPhoneNumber(tVals[2]);
			oTempCSObj.selectSingleNode('LocationName').text	= text("CS/TEMP");
			
			if (b_NEW_CS)
			{
				var oDeviceSettingsNode = oTempCSObj.selectSingleNode('DeviceSettings');
				oDeviceSettingsNode.selectSingleNode('LIST/ObjectsType').text = 'DEVICE_STATUS';
				
				// set DND and MSN status
				var children = oDevNode.selectNodes('DEVICE[OwnerAccount = /R/ACCOUNT//UniqueID]'), i=0;
				while (children[i])
				{
					var oDeviceStatus = GetTemplate('DEVICE_STATUS');
					var dnd_msg_node = oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID="'+children[i].selectSingleNode('NodeID').text+'"]/DNDMessages/LIST//String[0]');
					var dnd_string = (dnd_msg_node) ? dnd_msg_node.text : '';
					oDeviceStatus.selectSingleNode('NodeID').text 			= children[i].selectSingleNode('NodeID').text;
					oDeviceStatus.selectSingleNode('Extension').text 		= children[i].selectSingleNode('Extension').text;
					oDeviceStatus.selectSingleNode('PrimaryMessage').text 	= (tVals[1] == 'true') ? '' : dnd_string;
					AddChildNodeToListObject(oDeviceSettingsNode, oDeviceStatus);
					i++;
				}
				
				oTempCSObj.selectSingleNode('MsnStatus').text = (tVals[1] == 'true') ? 'NLN' : 'BSY';
				oTempCSObj.selectSingleNode('TenantGroup').text = oActNode.selectSingleNode('.//TenantGroup').text;
				oTempCSObj.selectSingleNode('Owner').text 		= oActNode.selectSingleNode('.//UniqueID').text;
				oCompStatusNode.appendChild(oTempCSObj);
				CallControlMethod('AddXMLObject', oTempCSObj);
			}
			else
				CallControlMethod('EditXMLObject', oOldTempCSObj, oTempCSObj);
	
			var oActStatusNode = oActNode.selectSingleNode('.//AccountStatus/ACC_STATUS');
			var oOldStatusNode = oActStatusNode.cloneNode(true);
			oActStatusNode.selectSingleNode('CurrentCompositeStatus').text 	= oTempCSObj.selectSingleNode('Description').text;
			oActStatusNode.selectSingleNode('Available').text 				= oTempCSObj.selectSingleNode('Available').text;
			CallControlMethod('EditXMLObject', oOldStatusNode, oActStatusNode.cloneNode(true));
						
			table['CS'].refresh();
			
			DisplayAccountStatus();
			UpdateStatusListItem(oActStatusNode);
		}
	}
}

function UpdateStatusListItem(oNewStatusNode)
{
	if (oNewStatusNode)
	{
		var status_path, contact_path, node_colon_ext, b_TEMP_STATUS;
		
		switch (oNewStatusNode.nodeName)
		{
			case 'ACC_STATUS':
				status_path 	= 'ACC_STATUS[OwnerUniqueID="'+ oNewStatusNode.selectSingleNode('OwnerUniqueID').text +'"]';
				contact_path 	= '[LinkParameter="'+oNewStatusNode.selectSingleNode('OwnerUniqueID').text+'"]';
				break;
				
			case 'DEVICE_STATUS':
				status_path 	= 'DEVICE_STATUS[Extension = "'+ oNewStatusNode.selectSingleNode('Extension').text +'"]';
				node_colon_ext 	= oNewStatusNode.selectSingleNode('NodeID').text +':'+ oNewStatusNode.selectSingleNode('Extension').text;
				contact_path 	= '[LinkParameter="'+ node_colon_ext +'" or Devices//String="'+ node_colon_ext +'"]';
				if (NodeIsDown(oNewStatusNode.selectSingleNode('NodeID').text))
					oNewStatusNode.setAttribute('inactive', 'true');
				break;
		}
		
		b_TEMP_STATUS = ((oSearchNode.selectSingleNode('.//CONTACT'+contact_path) || oCallLogNode.selectSingleNode('CALLLOG'+contact_path)) && !oABNode.selectSingleNode('CONTACT'+contact_path)) ? true : false;
		
		if (b_TEMP_STATUS)
		{
			var now = new Date();
			oNewStatusNode.setAttribute('temp', now.getTime());
			window.setTimeout('RemoveTemporaryStatus("'+ oNewStatusNode.getAttribute('temp') +'")', 30000);
		}

		if(oNewStatusNode.nodeName == "ACC_STATUS")
		{
			oNewStatusNode = AddChildNodeOrAdjustStatusObject(oNewStatusNode);
		}

		var oOldStatusNode = oStatusListNode.selectSingleNode(status_path);
		
		if (oOldStatusNode)
			oStatusListNode.replaceChild(oNewStatusNode.cloneNode(true), oOldStatusNode);
		else
			oStatusListNode.appendChild(oNewStatusNode.cloneNode(true));
	
		// update linked contacts in Personal Contacts
		if (b_LOGGED_ON)
			UpdateAllDisplaysForThisContact(contact_path);
	}
}

function AddChildNodeOrAdjustStatusObject(oNewStatusNode)
{
	var sStringObjXML = "<STR><String></String></STR>";
	var oSTRObj = new ActiveXObject("Msxml.DOMDocument");
	oSTRObj.loadXML(sStringObjXML);
	oSTRObj = oSTRObj.firstChild;
	var oChild = oSys.createElement("WebInvite");
	var user_status = parseInt(oNewStatusNode.selectSingleNode("Status").text);
	if((user_status & LOGGEDIN_TRAYCLIENT > 0) || (user_status & LOGGEDIN_WEBCLIENT > 0))
		oSTRObj.firstChild.text = 'true';
	else
		oSTRObj.firstChild.text = 'false';
	oChild.appendChild(oSTRObj.cloneNode(true));

//	alert(user_status);
	var oOldChild=oNewStatusNode.selectSingleNode("WebInvite");
	if(oOldChild)
		oNewStatusNode.replaceChild(oChild.cloneNode(true),oOldChild);
	else
		oNewStatusNode.appendChild(oChild.cloneNode(true));

	return oNewStatusNode;
}

function RemoveStatusListItem(obj)
{
	var link_type = obj.selectSingleNode('LinkType').text;
	var link_param = obj.selectSingleNode('LinkParameter').text;
	var status_obj, contact_path;
	switch (link_type)
	{
		case 'A':
			status_obj = oStatusListNode.selectSingleNode('ACC_STATUS[OwnerUniqueID="'+ link_param +'"]');
			contact_path 	= '[LinkParameter="'+link_param+'"]';
			break;
		
		case 'D':
			status_obj = oStatusListNode.selectSingleNode('DEVICE_STATUS[NodeColonExtension = "'+ link_param +'"]');
			contact_path 	= '[LinkParameter="'+ link_param +'" or Devices//String="'+ link_param +'"]';
			break;
	}
	if (status_obj && !oABNode.selectSingleNode('CONTACT'+contact_path))
	{
		oStatusListNode.removeChild(status_obj);
		UpdateAllDisplaysForThisContact(contact_path);
	}
}

function RemoveTemporaryStatus(stamp)
{
	var status = oStatusListNode.selectSingleNode('*[@temp="'+stamp+'"]');
	if (status)
	{
		switch (status.nodeName)
		{
			case 'ACC_STATUS':
				contact_path 	= '[LinkParameter="'+status.selectSingleNode('OwnerUniqueID').text+'"]';
				break;
				
			case 'DEVICE_STATUS':
				node_colon_ext 	= status.selectSingleNode('NodeID').text +':'+ status.selectSingleNode('Extension').text;
				contact_path 	= '[LinkParameter="'+ node_colon_ext +'" or Devices//String="'+ node_colon_ext +'"]';
				break;
		}
		oStatusListNode.removeChild(status);
		UpdateAllDisplaysForThisContact(contact_path);
	}
}

function UpdateStatusListItemsForNode(oNode)
{
	var contact_path, node_colon_ext, node_id = oNode.selectSingleNode('NodeNameElements//NodeID').text, b_node_active = boolVal(oNode.selectSingleNode('.//Active'));
		
	var aDeviceStatusNodes = oStatusListNode.selectNodes('DEVICE_STATUS[NodeID="'+node_id+'"]'), i=0;
	while (aDeviceStatusNodes[i])
		updateStatusObject(aDeviceStatusNodes[i++]);
		
	var aDevices = oDevNode.selectNodes('DEVICE[OwnerAccount="'+oActNode.selectSingleNode('.//UniqueID').text+'" and NodeID="'+node_id+'"]'), j=0;
	while (aDevices[j] && b_LOGGED_ON)
		ToggleDeviceInterfaceElements(aDevices[j++], !b_node_active);
	
	function updateStatusObject(oStatus)
	{
		switch (oStatus.nodeName)
		{
			case 'DEVICE_STATUS':
				node_colon_ext 	= oStatus.selectSingleNode('NodeID').text +':'+ oStatus.selectSingleNode('Extension').text;
				break;
		}
		(b_node_active) ? oStatus.removeAttribute('inactive') : oStatus.setAttribute('inactive', 'true');
		contact_path = '[LinkParameter = "'+ node_colon_ext +'" or Devices//String="'+ node_colon_ext +'"]';
		UpdateAllDisplaysForThisContact(contact_path);
	}
}

function nodeDown(node_id)
{
	var oNode = oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID="'+node_id+'"]');
	oNode.selectSingleNode('.//Active').text = 'FALSE';
	UpdateStatusListItemsForNode(oNode);
}

function nodeUp(node_id)
{
	var oNode = oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID="'+node_id+'"]');
	oNode.selectSingleNode('.//Active').text = 'TRUE';
	UpdateStatusListItemsForNode(oNode);
}

function NodeIsDown(node_id)
{
	var oNode = oNodesNode.selectSingleNode('NODE[NodeNameElements//NodeID="'+node_id+'"]');
	return (oNode) ? !boolVal(oNode.selectSingleNode('NodeNameElements//Active')) : false;
}

function AnyInactiveNodesForMyDevices()
{
	// return the number of nodes down which own devices associated with this account
	var aDownNodes = oRoot.selectNodes('NODES/NODE[.//Active="false" or .//Active="False" or .//Active="FALSE"]'),i=0;
	while (aDownNodes[i])
	{
		if (oRoot.selectNodes('DEVICES/DEVICE[OwnerAccount=/R/ACCOUNT//UniqueID and NodeID="'+aDownNodes[i].selectSingleNode('.//NodeID').text+'"]').length)
			return true;
		i++
	}
	return false;
}

//oNodesNode.selectSingleNode('NODE[.//NodeID="2"]').selectSingleNode('.//Active').text='false';

// ****************************************************
// *********************  SEARCH  *********************
// ****************************************************

var search_query = null;

function Search()
{
	cur_search_type='DSRS';
	getObj('cc_type_ahead_search').value = '';
	b_SEARCH_IS_TYPEAHEAD=0;
	ResetSearchVariables();
	search_query = GetSearchQuery();
	if (IsValid(search_query))
	{
		if (search_query==text('DS/DART'))
			window.open("img/archive/cricket.html");
		else if (search_query==text('DS/SHAKE'))
			shakeBrowser();
		else
		{
			var search_criteria = GetSearchCriteria();
			if (ValidateSearchTargetString(search_criteria))
			{
				CallControlMethod('Search', search_query, search_criteria);
				WaitCursor();
			}
			else
				Dialog(text('ERR/DS/NOSO'),0);
		}
	}
}

var cur_search_type;
var sDIVBeforeTASearch;

function NotifySearchResultSet(DataSourceName, oXMLDoc, NumberOfResultsInSet)
{
	var oCurSearchNode = oSearchNode.selectSingleNode(cur_search_type);
	RemoveChildNodes(oCurSearchNode);
	var aChildNodes = oXMLDoc.selectNodes("LIST/*/CONTACT");
	AddChildNodes(oCurSearchNode, aChildNodes);
	
	switch (cur_search_type)
	{
		case 'NA':
			table['NADL'].refresh();
			CheckListedNewAccountDevices();
			break;
		
/*		Outdated(version 3.0 and prior) Type ahead search results.
		case 'TA':
			(getObj('CC').style.display=='') ? ConfigureCallControlDisplay() : getObj('cc_call_control_toggle_icon').click();
			table['DSRS'] = table['TA'];
			table['TA'].refresh();
			SetButtons('TA');
			SetFocus('cc_type_ahead_search');
			break;*/
		
		case 'TARRWO':
		case 'TARRWA':
			table[cur_search_type].refresh();
			break;
	
		case 'TA':
			var oDSRSSearchNode = oSearchNode.selectSingleNode('DSRS');
			RemoveChildNodes(oDSRSSearchNode);
			RemoveChildNodes(oCurSearchNode);
			AddChildNodes(oDSRSSearchNode, aChildNodes);
			sDIVBeforeTASearch = sCurDiv;
			ToggleLink(this,"DS");
			nTotalSearchResults = NumberOfResultsInSet;
			ConfigureSearchResultDisplayTabs();
			table['DSRS'].refresh();
			SetButtons('DSRS');
			ChangeSearchView(1);
			AutoCursor();
			break;

		case 'DSRS':
			nTotalSearchResults = NumberOfResultsInSet;
			ConfigureSearchResultDisplayTabs();
			table['DSRS'].refresh();
			SetButtons('DSRS');
			ChangeSearchView(1);
			AutoCursor();
			break;
	}
}

function NewSearch()
{
	//ClearSearch('DSRS');
	getObj('cc_type_ahead_search').value = '';
	getObj('SearchSourceName').value = '';
	RemoveChildNodes(oSearchNode.selectSingleNode('DSRS'));
	ResetSearchVariables();
	search_query = '';
	table['DSRS'].refresh();
	ChangeSearchView(0);
	CheckLocalSearchOptions();
	getObj('SearchSourceName').select();
}

function ClearSearch(type)
{
	if (type=='DSRS')
	{
		getObj('cc_type_ahead_search').value = '';
//		RemoveChildNodes(oSearchNode.selectSingleNode('TA'));
		RemoveChildNodes(oSearchNode.selectSingleNode('DSRS'));
		search_query='';
		table['DSRS'].refresh();
		ToggleLink(this,sDIVBeforeTASearch);
		sCurDiv = sDIVBeforeTASearch;
		/*if (oCallListNode.hasChildNodes())
			ConfigureCallControlDisplay();
		else
			ToggleCallControl(getObj('cc_call_control_toggle_icon'));*/
	}
}

function ResetSearchVariables()
{
	RemoveChildNodes(oSearchNode.selectSingleNode('DSRS'));
	table['DSRS'].curDisplayIndex = 1;
}

function CheckLocalSearchOptions()
{
	getObj("SearchSourceCheckBox_Devices").checked = true;
	getObj("SearchSourceCheckBox_MyAddressBook").checked = true;
	getObj("SearchSourceCheckBox_SysSpeedDial").checked = true;
	getObj("SearchSourceCheckBox_ACCOUNTS").checked = true;
}

function GetSearchQuery()
{
	if (IsValid(getObj('SearchSourceName')))
		return getObj('SearchSourceName').value;
	else
	{
		AutoCursor();
		Dialog(text('ERR/DS/NONA'),0);
		SetFocus('SearchSourceName');
		return null;
	}
}

function ValidateSearchTargetString(databaseSearchTargets)
{
	var targetChosen = false;
	var bVals = new Array;
	var tVals = ParseDelimitedList(databaseSearchTargets)
	bVals[0] = ((tVals[0] & btSEARCH_SOURCES_Accounts) || (tVals[0] & btSEARCH_SOURCES_AddressBook) || (tVals[0] & btSEARCH_SOURCES_Devices) || (tVals[0] &  btSEARCH_SOURCES_SysSpdDial));
  	bVals[1] = (tVals[1].length > 1)?1:0;
	bVals[2] = (tVals[2].length > 1)?1:0;
	bVals[3] = (tVals[3].length > 1)?1:0;
	if (bVals[0] || bVals[1] || bVals[2] || bVals[3])
		return true;
	else
		return false;
}

//	^BoolSearchSysSpd^BoolSearchAddressBook^BoolSearchDeveices^DelimitedTenantGroups^DelimitedExternalSources^DelimitedNodeIDs^BeginIndex^NumberOfObjectsToReturn^SortBy^BoolAscendingOrder

var btSEARCH_SOURCES_Accounts                   = new Number(0x00000001);
var btSEARCH_SOURCES_AddressBook                = new Number(0x00000002);
var btSEARCH_SOURCES_Devices                    = new Number(0x00000004);
var btSEARCH_SOURCES_SysSpdDial                 = new Number(0x00000008);
var btSEARCH_FIELDS_FirstName                   = new Number(0x00000010);
var btSEARCH_FIELDS_MiddleName                  = new Number(0x00000020);
var btSEARCH_FIELDS_LastName                    = new Number(0x00000040);
var btSEARCH_FIELDS_CompanyName                 = new Number(0x00000080);
var btSEARCH_FIELDS_EmailAddress                = new Number(0x00000100);
var btSEARCH_FIELDS_UserID                      = new Number(0x00000200);
var btSEARCH_FIELDS_DeviceExtension             = new Number(0x00000400);
var btSEARCH_FIELDS_Group                       = new Number(0x00000800);
var btSEARCH_FIELDS_PBXDescription              = new Number(0x00001000);
var btSEARCH_FIELDS_PBXUsername                 = new Number(0x00002000);
var btSEARCH_CRITERIA_BeginingOfWordOnly        = new Number(0x00010000);
var btSEARCH_CRITERIA_EndingOfWordOnly          = new Number(0x00020000);
var btSEARCH_CRITERIA_FailIfNumObjectsFound     = new Number(0x00040000);
var btSEARCH_CRITERIA_ExcludeDeviceDuplicates   = new Number(0x00080000);
var btSEARCH_CRITERIA_ExcludeAccountDuplicates  = new Number(0x00100000);

function GetSearchCriteria(bTypeAheadRequest, bForceAllResults)
{
	var btSEARCH_PARAMETERS = 0;
	
	if (bTypeAheadRequest || CheckForTennantGroupSearch())
		btSEARCH_PARAMETERS  |= btSEARCH_SOURCES_Accounts;
		
	if (bTypeAheadRequest || CheckForDevicesSearch())
	{
		btSEARCH_PARAMETERS  |= btSEARCH_SOURCES_Devices;
		btSEARCH_PARAMETERS  |= btSEARCH_FIELDS_PBXDescription;
		btSEARCH_PARAMETERS  |= btSEARCH_FIELDS_PBXUsername;
	}
		
	if (bTypeAheadRequest || CheckForMyAddressBookSearch())
		btSEARCH_PARAMETERS  |= btSEARCH_SOURCES_AddressBook;

	if ((bTypeAheadRequest && cur_search_type!='TARRWA') || (!bTypeAheadRequest && CheckForSysSpeedDialSearch())) 
		btSEARCH_PARAMETERS  |= btSEARCH_SOURCES_SysSpdDial;
		
	btSEARCH_PARAMETERS |= btSEARCH_FIELDS_FirstName;
	btSEARCH_PARAMETERS |= btSEARCH_FIELDS_MiddleName;
	btSEARCH_PARAMETERS |= btSEARCH_FIELDS_LastName;
	btSEARCH_PARAMETERS |= btSEARCH_FIELDS_CompanyName;
	btSEARCH_PARAMETERS |= btSEARCH_FIELDS_DeviceExtension;
	
	if (bTypeAheadRequest)
	{
		btSEARCH_PARAMETERS |= btSEARCH_CRITERIA_BeginingOfWordOnly;
		btSEARCH_PARAMETERS |= btSEARCH_CRITERIA_ExcludeDeviceDuplicates;
		btSEARCH_PARAMETERS |= btSEARCH_CRITERIA_ExcludeAccountDuplicates;
		if (!bForceAllResults)
			btSEARCH_PARAMETERS |= btSEARCH_CRITERIA_FailIfNumObjectsFound;
	}
	return BuildSearchString(btSEARCH_PARAMETERS, bTypeAheadRequest, bForceAllResults)
}

function GetDeviceSearchCriteria()
{
	var btSEARCH_PARAMETERS = 0;
	btSEARCH_PARAMETERS |= btSEARCH_SOURCES_Devices;
	btSEARCH_PARAMETERS |= btSEARCH_FIELDS_PBXDescription;
	btSEARCH_PARAMETERS |= btSEARCH_FIELDS_PBXUsername;
	return BuildSearchString(btSEARCH_PARAMETERS, 0, 0, 1);
}

function BuildSearchString(nSearchParameters, bTypeAheadRequest, bForceAllResults, bNewAccountSearch)
{
	var tVals = new Array;
	tVals[tVals.length] = nSearchParameters;
	tVals[tVals.length] = (bNewAccountSearch) ? '^' : GetTennantGroupTargets(bTypeAheadRequest);
	tVals[tVals.length] = GetExternalSearchTargets();
	tVals[tVals.length] = GetNodeIDs();
	tVals[tVals.length] = '0';		// beginning index of search results
	tVals[tVals.length] = (bTypeAheadRequest && !bForceAllResults) ? '20' : '0';	// number of records requested (zero indicates all) - this will also be the 'too many' failure point for type ahead
	tVals[tVals.length] = '0';		// sort index (0-last, 1-first, 2-phone/last)
	tVals[tVals.length] = 'true';	// boolean indicating if sort is ascending
	return DelimitList(tVals);
}

function CheckForDevicesSearch()
{
	return getObj("SearchSourceCheckBox_Devices").checked;
}

function CheckForMyAddressBookSearch()
{
	return getObj("SearchSourceCheckBox_MyAddressBook").checked;
}

function CheckForSysSpeedDialSearch()
{
	return getObj("SearchSourceCheckBox_SysSpeedDial").checked;
}

function CheckForTennantGroupSearch()
{
	return getObj("SearchSourceCheckBox_ACCOUNTS").checked;
}

function GetTennantGroupTargets(bTypeAheadRequest)
{
	var sVals = new Array;
	if (oActNode.selectSingleNode("SearchScope").hasChildNodes() && (bTypeAheadRequest || getObj("SearchSourceCheckBox_ACCOUNTS").checked))
	{
		var aTenGroups = oActNode.selectNodes("SearchScope/LIST//String"), i=0;
		while (aTenGroups[i])
			sVals[sVals.length] = aTenGroups[i++].text;
	}
	return DelimitList(sVals);
}

function GetExternalSearchTargets()
{
	var tVals = new Array;
	if (oDirNode.hasChildNodes())
	{
		var aExtDirs = oDirNode.selectNodes('DIRECTORY'), i=0;
		while (aExtDirs[i])
		{
			var description = aExtDirs[i].selectSingleNode('Description').text;
			var obj = getObj('SearchSourceCheckBox_Ext_'+ description);
			if (obj && obj.checked)
				tVals[tVals.length] = description;
			i++;
		}
		return DelimitList(tVals);
	}
	else
		return null;
}

function GetNodeIDs()
{
	var aNodeIDs = oNodesNode.selectNodes("NODE/NodeID");
	var aIDs = new Array, i=0;
	while (aNodeIDs[i])
		aIDs[aIDs.length] = aNodeIDs[i++].text;
	return DelimitList(aIDs);
}

function ChangeSearchView(nViewTabIndex)
{
	var oTabHead = getObj("DS").firstChild.nextSibling.firstChild.firstChild;
//	alert(getObj("DS").firstChild.nextSibling.firstChild.firstChild.text);
	oTabHead.children[nViewTabIndex].click();
}

// ****************************************************
// ******************  MESSAGES  **********************
// ****************************************************

//<MSG_WAITING><NodeID>1</NodeID><Extension>1003</Extension><SourceName></SourceName><SourceNodeExtension>1:2503</SourceNodeExtension><Mailbox>1003</Mailbox><NumberOfMessages>0</NumberOfMessages></MSG_WAITING>

function DeleteMessage(id, msg_type)
{
	 if (msg_type=='SYSTEM_MESSAGE')
	 	DeleteSystemMessage(id);
	 else
	 	DeleteStationMessage(id);
}

function AddStationMessage(type, sID, node_colon_ext)
{
	var obj, xpath, primary_device;
	switch (type)
	{
		case 'TA':
		case 'DSRS':
			obj 	= oSearchNode.selectSingleNode(type+'/CONTACT[UniqueID="'+sID+'"]');
			xpath 	= (obj.selectSingleNode('LinkType').text=='D') ? 'LinkParameter' : 'Devices//String[0]';
			node_colon_ext 	= obj.selectSingleNode(xpath).text;
			break;
			
		case 'AB':
			// node_colon_ext will be embedded in the device icon in the Personal Contacts;
			break;
			
		case 'PM':
			break;
	}
	if (node_colon_ext && oDevNode.hasChildNodes())
	{
		primary_device = oDevNode.firstChild;
		// check for primary device bit set in flags field
		while (primary_device && !(DEVICE_FLAG_IS_PRIMARY & parseFloat(primary_device.selectSingleNode('Flags').text)))
			primary_device = primary_device.nextSibling;
		var oMsg = GetTemplate('MSG_WAITING');
		oMsg.selectSingleNode('NodeID').text = node_colon_ext.split(':')[0];
		oMsg.selectSingleNode('Extension').text = node_colon_ext.split(':')[1];
		oMsg.selectSingleNode('SourceNodeExtension').text = primary_device.selectSingleNode('NodeID').text+':'+primary_device.selectSingleNode('Extension').text;
		oMsg.selectSingleNode('NumberOfMessages').text = '1';
		CallControlMethod('AddXMLObject', oMsg);
	}
}

function DeleteStationMessage(sSourceNodeExtension)
{
	oMsg = oMsgNode.selectSingleNode('MSG_WAITING[SourceNodeExtension="'+sSourceNodeExtension+'"]');
	if (oMsg && Confirm('MS'))
	{
		CallControlMethod('DeleteXMLObject', oMsg);
	}
}

function CheckMessage(destNum, mailbox)
{
	CallControlMethod("MessageReply", destNum, mailbox);
}
/*
- <MSG_WAITING>
	  <NodeID>1</NodeID> 
	  <Extension>1004</Extension> 
	  <SourceAccountID>Paul</SourceAccountID> 
	  <SourceName /> 
	  <SourceNodeExtension>1:2503</SourceNodeExtension> 
	  <Mailbox>1004</Mailbox> 
	  <NumberOfMessages>1</NumberOfMessages> 
  </MSG_WAITING>
- <MSG_WAITING>
  <NodeID>1</NodeID> 
	  <Extension>1004</Extension> 
	  <SourceAccountID>Paul</SourceAccountID> 
	  <SourceName>Paul Ostrowski</SourceName> 
	  <SourceNodeExtension>1:1001</SourceNodeExtension> 
	  <Mailbox /> 
	  <NumberOfMessages>1</NumberOfMessages> 
  </MSG_WAITING>
  </MESSAGES>

*/

function UpdateMessageWaitingObject(oMsgObj)
{
	var oExistingNode = oMsgNode.selectSingleNode('MSG_WAITING[Extension="'+ oMsgObj.selectSingleNode('Extension').text +'" and  SourceNodeExtension="'+ oMsgObj.selectSingleNode('SourceNodeExtension').text +'" and Mailbox="'+oMsgObj.selectSingleNode('Mailbox').text+'"]');
	var b_DISPLAY_MSG_NOTIFICATION=0;
	var new_num_msg = parseFloat(oMsgObj.selectSingleNode('NumberOfMessages').text);
	if (oExistingNode)
	{
		var old_num_msg = parseFloat(oExistingNode.selectSingleNode('NumberOfMessages').text);
		// set the number this message equal to the new message object
		if (new_num_msg)
		{
			oExistingNode.selectSingleNode('NumberOfMessages').text = new_num_msg;
			if (new_num_msg >= old_num_msg)
				b_DISPLAY_MSG_NOTIFICATION=1;
		}
		// otherwise, if the number in the new message is zero - no more messages - remove the node
		else
			oMsgNode.removeChild(oExistingNode);
	}
	// currently two updates are received for one delete - prevent this from being added by checking the number node
	else if (new_num_msg)
	{
		AddChildNodes(oMsgNode, new Array(oMsgObj));
		b_DISPLAY_MSG_NOTIFICATION=1;
	}
	
	if (b_DISPLAY_MSG_NOTIFICATION)
		MessageNotification(true);
	else if (!oMsgNode.hasChildNodes())
		MessageNotification(false);
	
	table['MS'].refresh();
}

// ****************************************************
// ****************  SYSTEM MESSAGES  *****************
// ****************************************************

var bt_TRANSIENT_MESSAGE = new Number(0x00000001);

function DisplayTransientMessage(oMsg)
{
	var msg = getErrorString(oMsg.selectSingleNode('ReturnCodes//ReasonCodes').text, 'Long', oMsg.selectSingleNode('ReturnCodes//Parameters').text);
	Dialog(msg, 0);
}

function IsTransientMessage(oMsg)
{
	var flags = parseFloat(oMsg.selectSingleNode('Flags').text);
	return (flags &= bt_TRANSIENT_MESSAGE) == bt_TRANSIENT_MESSAGE;
}

function AddSystemMessageTranslation(oMsg)
{
	var oTranslation = oSys.createElement('Translation');
	oTranslation.text = getErrorString(oMsg.selectSingleNode('ReturnCodes//ReasonCodes').text, 'Long', oMsg.selectSingleNode('ReturnCodes//Parameters').text);
	oMsg.appendChild(oTranslation);
}

function ViewSystemMessage(id)
{
	var obj = oMsgNode.selectSingleNode('SYSTEM_MESSAGE[UniqueID="'+id+'"]');
	if (obj)
	{
		BuildDiv('MSEX', obj);
		CreateSystemMessageObjectLink(id);
		Hide('tableMS');
		Show('MSEX');
	}
}

function HideSystemMessage()
{
	Hide('MSEX');
	Show('tableMS');
	SetButtons('MS');
}

function DeleteSystemMessage(id)
{
	id = (id) ? id : getObj('MSEX').firstChild.UniqueID;
	var obj = oMsgNode.selectSingleNode('SYSTEM_MESSAGE[UniqueID="'+ id +'"]');
	if (obj)
	{
		CallControlMethod('DeleteXMLObject', obj.cloneNode(true));
		oMsgNode.removeChild(obj);
		table['MS'].refresh();
		HideSystemMessage();
	}
}

/*
[ -- STEP -- ]
<RETURN_CODE>
	<ReasonCodes>-RSF-RC-OAI_16</ReasonCodes> 
	<Parameters>|^5P801^352||</Parameters> 
	<ObjectsAsString>~|^STEP^0^Paul^352~~</ObjectsAsString> 
</RETURN_CODE>

[ -- CONTACT -- ]
<RETURN_CODE>
	<ReasonCodes>-MCSN</ReasonCodes> 
	<Parameters>|^2^1:1008</Parameters> 
	<ObjectsAsString>~|^CONTACT^0^Paul^1058|^CONTACT^0^Paul^1059</ObjectsAsString> 
</RETURN_CODE>
*/

// |div_id|rule_unique_id|rule_edit_form_tab_num|step_unique_id
function CreateSystemMessageObjectLink(id)
{
	var oMsg = oMsgNode.selectSingleNode('SYSTEM_MESSAGE[UniqueID="'+id+'"]'), i=0;
	var params = ParseDelimitedList(ParseDelimitedList(oMsg.selectSingleNode('ReturnCodes//Parameters').text)[0]);
	var objects = ParseDelimitedList(ParseDelimitedList(oMsg.selectSingleNode('ReturnCodes//ObjectsAsString').text)[0]);
	while (objects[i])
	{
		var obj_vals = ParseDelimitedList(objects[i]);
		var target = '|{0}|{1}|{2}|{3}';
		var target_inserts = new Array;
		var objlink = '<div style=\"margin:15px 10px;font-weight:bold\"><a href=\"javascript://\" onclick=\"HandleObjectLink(\'^true^{0}\')\">{1}</a> {2}</div>';
		var objlink_inserts = new Array;
		// in each case below make sure the object still exists, it may have been removed after the message was created
		switch (obj_vals[0])
		{
			case 'STEP':
				var owning_rule = FindOwningRule(obj_vals[3]);
				var step = oStepsNode.selectSingleNode('STEP[UniqueID="'+obj_vals[3]+'"]');
				if (owning_rule && step)
				{
					target_inserts[0] = 'RR';
					target_inserts[1] = owning_rule.selectSingleNode('UniqueID').text;
					target_inserts[2] = '2';
					target_inserts[3] = obj_vals[3];
					objlink_inserts[0] = InsertMultiple(target_inserts, target);
					objlink_inserts[1] = text('MS/CLK_HERE');
					objlink_inserts[2] = Insert(text('ITEM/RREDWA'), text('MS/ED_THIS'));
					objlink = InsertMultiple(objlink_inserts, objlink);
					getObj('ms_translation').insertAdjacentHTML('afterEnd', objlink);
				}
				break;
				
			case 'COMPOSITE_STATUS':
				var status = oCompStatusNode.selectSingleNode('COMPOSITE_STATUS[Description="'+obj_vals[3]+'"]');
				if (status)
				{
					target_inserts[0] = 'AB';
					target_inserts[1] = status.selectSingleNode('DN').text;
					objlink_inserts[0] = InsertMultiple(target_inserts, target);
					objlink_inserts[1] = text('MS/CLK_HERE');
					objlink_inserts[2] = Insert((text('ITEM/AB')+ Insert(obj_vals[3], ' ({0})')), text('MS/ED_THIS'));
					objlink = InsertMultiple(objlink_inserts, objlink);
					getObj('ms_translation').insertAdjacentHTML('afterEnd', objlink);
				}
				break;
				
			case 'CONTACT':
				// TO DO: determine how many object links need go be created, 
				// then loop through a delimited list of id's creating a link to each object.				
				var contact = oABNode.selectSingleNode('CONTACT[UniqueID="'+obj_vals[3]+'"]'), name = '';
				if (contact)
				{
					name = contact.selectSingleNode('FirstName').text +' '+contact.selectSingleNode('LastName').text;
					if (name.length==1)
						name = contact.selectSingleNode('Company').text;
					target_inserts[0] = 'AB';
					target_inserts[1] = obj_vals[3];
					objlink_inserts[0] = InsertMultiple(target_inserts, target);
					objlink_inserts[1] = text('MS/CLK_HERE');
					objlink_inserts[2] = Insert((text('ITEM/AB')+ Insert(name,' ({0})')), text('MS/ED_THIS'));
					objlink = InsertMultiple(objlink_inserts, objlink);
					getObj('ms_translation').insertAdjacentHTML('afterEnd', objlink);
				}
				break;
		}
		i++;
	}
}

// ****************************************************
// *******************  ROUTING RULES  ****************
// ****************************************************

/*
<RULE>
	<DN></DN>
	<UniqueID></UniqueID>
	<Owner></Owner>
	<TenantGroup></TenantGroup>
	<Enabled>TRUE</Enabled>
	<WhoType>-842150451</WhoType>
	<WhoParam></WhoParam>
	<WhenCompStatus></WhenCompStatus>
	<WhenTime></WhenTime>
	<WhenLocation></WhenLocation>
	<WhenAvail>-842150451</WhenAvail>
	<Steps></Steps>
</RULE>
*/

function UpdateRoutingRuleTables()
{
	table['RR'].refresh();
	if (table['RREDWA'])
		table['RREDWA'].refresh();
}

function ToggleRoutingRule(oIcon, sCurID)
{
	var bEnabled = (GetImgSrc(oIcon)=='iRuleOn')?1:0;
	var rule = oRulesNode.selectSingleNode('RULE[UniqueID="'+sCurID+'"]');
	var oldRule = rule.cloneNode(true);
	rule.selectSingleNode('Enabled').text = (bEnabled)?'false':'true';
	oIcon.src = (bEnabled) ? 'img/iRuleOff.gif' : 'img/iRuleOn.gif';
	CallControlMethod('EditXMLObject', oldRule, rule);
}

var oCurRule;

function AddRoutingRule()
{
	var date = new Date();
	var oRule = GetTemplate('RULE');
	oRule.selectSingleNode('Owner').text = oActNode.selectSingleNode('.//UniqueID').text;
	oRule.selectSingleNode('TenantGroup').text = oActNode.selectSingleNode('.//TenantGroup').text;
	oRule.selectSingleNode('UniqueID').text = date.getTime();
	oRule.selectSingleNode('Rank').text = '0';
	oRule.selectSingleNode('Enabled').text = 'true';
	oRule.setAttribute('editType', 'add');
	oRulesNode.appendChild(oRule);
	
	SetUpRoutingRuleEditForm(oRule);
}

function CopyRoutingRule(unique_id)
{
	var oRule = oRulesNode.selectSingleNode('RULE[UniqueID="'+unique_id+'"]');
	var step_ids = new Array;
	if (oRule)
	{
		var date = new Date();
		var oRuleCopy = oRule.cloneNode(true);
		oRuleCopy.selectSingleNode('DN').text = '';
		oRuleCopy.selectSingleNode('UniqueID').text = date.getTime();
		oRuleCopy.selectSingleNode('Rank').text = '0';
		oRuleCopy.selectSingleNode('Enabled').text = 'true';
		oRulesNode.appendChild(oRuleCopy);
		var steps = ParseDelimitedList(oRule.selectSingleNode('Steps').text), j=0;
		while (steps[j])
		{
			var oStep = oStepsNode.selectSingleNode('STEP[UniqueID="'+steps[j]+'"]');
			var oStepCopy = oStep.cloneNode(true);
			step_ids[j] = 'STEP_COPY_' + steps[j];
			oStepCopy.selectSingleNode('UniqueID').text = step_ids[j];
			oStepCopy.selectSingleNode('DN').text = '';
			oStepsNode.appendChild(oStepCopy);
			j++;
		}

		oRuleCopy.selectSingleNode('Steps').text = DelimitList(step_ids);
		EditRoutingRule(oRuleCopy.selectSingleNode('UniqueID').text);
		oRuleCopy.setAttribute('editType', 'add');
		
		var k = 0;
		while (step_ids[k])
		{
			var oStepCopy = oStepsNode.selectSingleNode('STEP[UniqueID="'+step_ids[k]+'"]');
			CallControlMethod('AddXMLObject', oStepCopy.cloneNode(true));
			k++;
		}
	}
}

var ROUTINGRULE_WHOTYPE_ALLCALLERS            =   0;
var ROUTINGRULE_WHOTYPE_ALL_EXTERNAL_CALLERS  = 100;
var ROUTINGRULE_WHOTYPE_ALL_INTERNAL_CALLERS  = 200;
var ROUTINGRULE_WHOTYPE_GROUP                 = 300;
var ROUTINGRULE_WHOTYPE_CONTACT               = 400;
var ROUTINGRULE_WHOTYPE_CUSTOM                = 500;

var ROUTINGRULE_WHENAVAIL_UNDEFINED           = -1;
var ROUTINGRULE_WHENAVAIL_UNAVAILABLE         = 0;
var ROUTINGRULE_WHENAVAIL_AVAILABLE           = 1;
	
function EditRoutingRule(sCurID)
{
	oRule = oRulesNode.selectSingleNode('RULE[UniqueID="'+sCurID+'"]');
	oRule.setAttribute('editType', 'edit');
	
	SetUpRoutingRuleEditForm(oRule);
	
	// set who type
	var nWhoType = parseFloat(oRule.selectSingleNode('WhoType').text);
	var nWhoParam = oRule.selectSingleNode('WhoParam').text;
	SetRadio('rr_who_type', null, nWhoType);
	
	switch (nWhoType)
	{
		case ROUTINGRULE_WHOTYPE_GROUP:
			var oGroupSelect = getObj('rr_who_group_name');
			SetSelectIndex(oGroupSelect, nWhoParam, 1);
			break;
		case ROUTINGRULE_WHOTYPE_CONTACT:
			var oObj = oABNode.selectSingleNode('CONTACT[UniqueID="'+nWhoParam+'"]');
			oObj = oObj.cloneNode(true);
			oObj.selectSingleNode('ModifyTimeStamp').text == 'Personal Contacts';
			oTARRWOobj = oObj;
			DisplayRuleStepTarget(oTARRWOobj, 'TARRWO');
			ToggleWhoSearch(getObjects('rr_who_type')[4]);
			break;
		case ROUTINGRULE_WHOTYPE_CUSTOM:
			getObj('rr_who_custom_num').value = FormatPhoneNumber(nWhoParam);
			break;
	}
	
	// set when type
	var oWhenRadio = getObj('rr_when_type');
	var oWhenCompStatus = oRule.selectSingleNode('WhenCompStatus');
	var oWhenAvail = oRule.selectSingleNode('WhenAvail');
	var oWhenDays = oRule.selectSingleNode('WhenTimeDays');
	// availability
	if (oWhenAvail.text!='-1')
	{
		SetRadio('rr_when_type',0);
		// invert nWhenAvail for index, 1 means Available, Available is the zero index radio button
		SetRadio('rr_when_type_avail', (1-parseFloat(oWhenAvail.text)));
	}
	// composite status
	else if (oWhenCompStatus.text)
	{
		SetRadio('rr_when_type',1);
		var oWhenStatusSelect = getObj('rr_when_status_select');
		SetSelectIndex(oWhenStatusSelect, oWhenCompStatus.text, 1);
	}
	else
		SetRadio('rr_when_type',2);
		
	// hours modifier
	var sStart = parseFloat(oRule.selectSingleNode('WhenTimeMinuteStart').text);
	var sStop = parseFloat(oRule.selectSingleNode('WhenTimeMinuteStop').text);
	var b_HOURS_ACTIVE = (sStart || sStop);
	getObj('rr_when_type_hours').checked = (b_HOURS_ACTIVE) ? 1:0;
	if (b_HOURS_ACTIVE)
	{	
		var sStartHours = parseInt(sStart/60);
		var sStartMin = (sStart % 60);
		var sStartAmpm = 'AM';
		if (sStartHours > 11)
		{
			 sStartHours -= 12;
			 sStartAmpm = 'PM';
		}
		
		var sStopHours = parseInt(sStop/60);
		var sStopMin = (sStop % 60);
		var sStopAmpm = 'AM';
		if (sStopHours > 11)
		{
			 sStopHours -= 12;
			 sStopAmpm = 'PM';
		}
		
		var oSelectStartHours = getObj('rr_when_time_start_hours');
		var oSelectStartMins = getObj('rr_when_time_start_min');
		var oSelectStartAmpm = getObj('rr_when_time_start_ampm');
		var oSelectStopHours = getObj('rr_when_time_stop_hours');
		var oSelectStopMins = getObj('rr_when_time_stop_min');
		var oSelectStopAmpm = getObj('rr_when_time_stop_ampm');
		
		SetSelectIndex(oSelectStartHours, sStartHours, 0);
		SetSelectIndex(oSelectStartMins, sStartMin, 1);
		SetSelectIndex(oSelectStartAmpm, sStartAmpm, 1);
		SetSelectIndex(oSelectStopHours, sStopHours, 0);
		SetSelectIndex(oSelectStopMins, sStopMin, 1);
		SetSelectIndex(oSelectStopAmpm, sStopAmpm, 1);
		
		ToggleDiv('rr_when_hours');
	}
	
	// day modifier
	var b_DAYS_ACTIVE = (parseFloat(oWhenDays.text));
	getObj('rr_when_type_days').checked = (b_DAYS_ACTIVE) ? 1:0;
	if (b_DAYS_ACTIVE)
	{
		b_CHECK_ALL=0;
		ConfigureDaysOfWeekCheckboxes(false, parseFloat(oWhenDays.text));
		getObj('rr_when_dow_toggle').innerText = text('RR/UCHK_ALL');
		ToggleDiv('rr_when_days');
	}
	
	// date modifier
	var b_DATE_ACTIVE = (parseFloat(oRule.selectSingleNode('WhenTimeMonthStart').text) && parseFloat(oRule.selectSingleNode('WhenTimeDayStart').text) && parseFloat(oRule.selectSingleNode('WhenTimeMonthStop').text) && parseFloat(oRule.selectSingleNode('WhenTimeDayStop').text))
	getObj('rr_when_type_date').checked = (b_DATE_ACTIVE) ? 1:0;
	if (b_DATE_ACTIVE)
	{
		var oSelectStartMonth = getObj('rr_when_date_start_month');
		var oSelectStartDay = getObj('rr_when_date_start_day');
		var oSelectStopMonth = getObj('rr_when_date_stop_month');
		var oSelectStopDay = getObj('rr_when_date_stop_day');
		
		SetSelectIndex(oSelectStartMonth, oRule.selectSingleNode('WhenTimeMonthStart').text, 0);
		SetDatesForThisMonth(oSelectStartMonth);
		SetSelectIndex(oSelectStartDay, oRule.selectSingleNode('WhenTimeDayStart').text, 1);
		SetSelectIndex(oSelectStopMonth, oRule.selectSingleNode('WhenTimeMonthStop').text, 0);
		SetDatesForThisMonth(oSelectStopMonth);
		SetSelectIndex(oSelectStopDay, oRule.selectSingleNode('WhenTimeDayStop').text, 1);
		ToggleDiv('rr_when_date');
	}
}

function GetStepTargetObject(oStep)
{
	var sStepType = oStep.selectSingleNode('StepType').text;
	if (_STEPTYPE_TRANSFER_TO_ACCOUNT == sStepType || _STEPTYPE_SEND_TO_ACCOUNT == sStepType)
	{
		var unique_id = oStep.selectSingleNode('Destination').text;
		if (!oTempNode.selectSingleNode('ACCOUNT_NAME[UniqueID="'+unique_id+'"]'))
		{
			var request_account_name = GetTemplate('ACCOUNT_NAME');
			request_account_name.selectSingleNode('UniqueID').text = unique_id;
			var obj = CallControlMethod('GetObjectSynch', request_account_name, 'MASK_SERVER_ERROR_MSG');
			if (obj)
				oTempNode.appendChild(obj.firstChild);
			else
				notifyUserOfMissingObject(oStep);
		}
	}
	if (_STEPTYPE_SEND_TO_DEVICE == sStepType)
	{
		var t_vals = oStep.selectSingleNode('Destination').text.split(':');
		if (!oTempNode.selectSingleNode('DEVICE_NAME[NodeID="'+t_vals[0]+'" and Extension="'+t_vals[1]+'"]'))
		{
			var request_device_name = GetTemplate('DEVICE_NAME');
			request_device_name.selectSingleNode('NodeID').text 	= t_vals[0];
			request_device_name.selectSingleNode('Extension').text 	= t_vals[1];
			obj = CallControlMethod('GetObjectSynch', request_device_name, 'MASK_SERVER_ERROR_MSG');
			if (obj)
			{
				var node = oSys.createElement('NodeColonExtension');
				node.text = oStep.selectSingleNode('Destination').text;
				obj.firstChild.appendChild(node);
				oTempNode.appendChild(obj.firstChild);
			}
			else
				notifyUserOfMissingObject(oStep);
		}
	}
	
	function notifyUserOfMissingObject(oStep)
	{
		var owning_rule = FindOwningRule(oStep.selectSingleNode('UniqueID').text);
		if (owning_rule)
		{
			var link = '<link onclick=\"ValidateReturnValue(\'true\')\">'+ owning_rule.selectSingleNode('Description').text +'</link>';
			var ret_val = Dialog(Insert(link, text('DLG/RR/OBJ_DELETED')),14);
			if (eval(ParseDelimitedList(ret_val)[0]))
				HandleObjectLink('^true^|RR|'+ owning_rule.selectSingleNode('UniqueID').text +'|2|'+oStep.selectSingleNode('UniqueID').text);
		}
	}
}

/*
_STEPTYPE_SEND_TO_DEVICE
_STEPTYPE_TRANSFER_TO_ACCOUNT
*/

function SetUpRoutingRuleEditForm(oRule)
{
	RemoveChildNodes(oSearchNode.selectSingleNode('TARRWO'));
	
	getObj('RREX').innerHTML = "<div id=\"tabsRRED\" class=\"tabs\"></div>";
	BuildDiv('RRED', oRoot);
	
	// set form property so the following build table can pick up the id to locate the correct steps
	getObj('formRREDWA').curRule = oRule.selectSingleNode('UniqueID').text;
	
	SetStepDisplayAttributes(oRule);
	
//	Hide('tableRR');
	Hide('RLRR');
	BuildTable('RREDWA');
	BuildTable('TARRWO');

	//added in UC 4.0. When a new rule is being added. the WHAT step should show the content by default 
	//instead of the user having to click on add step button
	if(oRule.getAttribute('editType')=='add')
		AddStep();

	Show('RREX');
	
	b_CHECK_ALL=1;
	SetRadio('rr_who_type', 0);
	SetRadio('rr_when_type', null, 'anytime');
	// correct the buttons set by building the table
	SetButtons('RREDWO');

	// set Buttons will set all the button in the display/show all mode. Since this a new rule thats being added, there wont be any steps to show. 
	// The What step will display the first step to be added. Since we know that this is already a first step, the previous step should not be enabled on the form
	// Therefore the firstchild of the buttons which points to "previous step" should be disabled.
	if(oRule.getAttribute('editType')=='add')
		getObj('RL').children['buttons'].firstChild.children[1].className = 'button_disabled';

	oCurRule = oRule;
}

function CancelRoutingRule()
{
	if (oCurRule.getAttribute('editType')=='add')
	{
		DeleteStepsForThisRule(oCurRule);
		oRulesNode.removeChild(oCurRule);
	}

	DeleteUnsavedNewSteps();
	ClearDeletedAttributeFromSteps();
	CloseRoutingRule();
}

function CloseRoutingRule()
{
	if(oCurRule.getAttribute("editType") != null)
		oCurRule.removeAttribute('editType');
	oCurRule=null;
	oTARRWOobj=null;
	oTARRWAobj=null;
	cur_search_type=null;
	
	ClearNewStepAttributes();
	
	Hide('RREX');
	table['RR'].refresh();
//	Show('tableRR');
	Show('RLRR');
	SetButtons('RR');
	HighlightRow();
}

function SaveRoutingRule()
{
    if(oCurRule == null)
        return;
	var oRule = oCurRule;
	var oOldRule = oCurRule.cloneNode(true);
	var aInserts = new Array('', '', '', '', '', '');
	
	if (ValidateRule(oRule))
	{
		// UI objects
		var oSelectedWhoRadio = GetSelectedRadio('rr_who_type');
		var oSelectedWhenRadio = GetSelectedRadio('rr_when_type');
		
		// Rule nodes
		var oWhoTypeNode = oRule.selectSingleNode('WhoType');
		var oWhoParamNode = oRule.selectSingleNode('WhoParam');
		var oWhenAvailNode = oRule.selectSingleNode('WhenAvail');
		var oWhenCompStatusNode = oRule.selectSingleNode('WhenCompStatus');
		
		switch ( parseFloat(oSelectedWhoRadio.value) )
		{
			case ROUTINGRULE_WHOTYPE_GROUP:
				var oWhoGroupSelect = getObj('rr_who_group_name');
				oWhoParamNode.text = oWhoGroupSelect.options[oWhoGroupSelect.selectedIndex].text;
				aInserts[0] = oWhoParamNode.text;
				break;
			case ROUTINGRULE_WHOTYPE_CONTACT:
				oWhoParamNode.text = oTARRWOobj.selectSingleNode('UniqueID').text;
				aInserts[0] = getObj('rr_target_TARRWO').innerText;
				break;
			case ROUTINGRULE_WHOTYPE_CUSTOM:
				oWhoParamNode.text = StripPhoneNumber(getObj('rr_who_custom_num').value);
				aInserts[0] = FormatPhoneNumber(oWhoParamNode.text);
				break;
		}
		oWhoTypeNode.text = oSelectedWhoRadio.value;
		
		switch (oSelectedWhenRadio.value)
		{
			case 'availability':
				oWhenAvailNode.text = GetSelectedRadio('rr_when_type_avail').value;
				aInserts[1] = (parseFloat(oWhenAvailNode.text)) ? text('CS/AVA') : text('CS/UNAV');
				break;
			
			case 'status':
				var oWhenSelect = getObj('rr_when_status_select');
				oWhenAvailNode.text = '-1';
				oWhenCompStatusNode.text = oWhenSelect.options[oWhenSelect.selectedIndex].text;
				aInserts[1] = oWhenCompStatusNode.text
				break;
			
			case 'anytime':
				oWhenAvailNode.text = '-1';
				break;
		}
		
		// hours modifier
		if (getObj('rr_when_type_hours').checked)
		{
			var sMilStart 	= BuildTimeString('rr_when_time_start', true);
			var sMilStop 	= BuildTimeString('rr_when_time_stop', true);
			var aStart 		= sMilStart.split(':');
			var sStop 		= sMilStop.split(':');
			oRule.selectSingleNode('WhenTimeMinuteStart').text = ((parseFloat(aStart[0])*60) + parseFloat(aStart[1]));
			oRule.selectSingleNode('WhenTimeMinuteStop').text = ((parseFloat(sStop[0])*60) + parseFloat(sStop[1]));
			aInserts[2] = BuildTimeString('rr_when_time_start', false);
			aInserts[3] = BuildTimeString('rr_when_time_stop', false);
		}
		else
		{
			oRule.selectSingleNode('WhenTimeMinuteStart').text = '0';
			oRule.selectSingleNode('WhenTimeMinuteStop').text = '0';
		}
		

		// days modifier
		if (getObj('rr_when_type_days').checked)
		{
			var oWhenTimeDaysNode = oRule.selectSingleNode('WhenTimeDays');
			// days which the timeframe rule applies
			oWhenTimeDaysNode.text = ConfigureDaysOfWeekCheckboxes(true);
		}
		
		// date modifier
		if (getObj('rr_when_type_date').checked)
		{	
			var sDateStart = BuildDateString('rr_when_date_start');
			var sDateStop = BuildDateString('rr_when_date_stop');

			var oWhenDateMonthStartNode = oRule.selectSingleNode('WhenTimeMonthStart')
			var oWhenDateDayStartNode	= oRule.selectSingleNode('WhenTimeDayStart')
			var oWhenDateMonthStopNode 	= oRule.selectSingleNode('WhenTimeMonthStop');
			var oWhenDateDayStopNode	= oRule.selectSingleNode('WhenTimeDayStop');
			
			oWhenDateMonthStartNode.text 	= parseFloat(sDateStart.split('/')[0]);
			oWhenDateDayStartNode.text 		= parseFloat(sDateStart.split('/')[1]);
			oWhenDateMonthStopNode.text 	= parseFloat(sDateStop.split('/')[0]);
			oWhenDateDayStopNode.text 		= parseFloat(sDateStop.split('/')[1]);
			
			aInserts[4] = PrependString(oWhenDateMonthStartNode.text, '0', 2) +'/'+ PrependString(oWhenDateDayStartNode.text, '0', 2);
			aInserts[5] = PrependString(oWhenDateMonthStopNode.text, '0', 2) +'/'+ PrependString(oWhenDateDayStopNode.text, '0', 2);
		}
		
		if (MatchingWhoWhenInfoInExistingRule(oRule))
			return false;
		
		RemoveDeletedSteps();
		UpdateStepList(oRule);
		SetStepDisplayAttributes(oRule);
		ClearOldWhenInfo(oRule, oSelectedWhenRadio.value, getObj('rr_when_type_hours').checked, getObj('rr_when_type_days').checked, getObj('rr_when_type_date').checked);
		
		if (oRule.getAttribute('editType') == 'add')
		{
			oRule.selectSingleNode('Description').text = text('RR/DES_NEW');
			CallControlMethod('AddXMLObject', oRule);
		}
		else
			CallControlMethod('EditXMLObject', oOldRule, oRule);
		
		table['RR'].refresh();
		CloseRoutingRule();
	}
}

function UpdateStepList(oRule)
{
	// update step order
	var child = table['RREDWA'].body.firstChild, steps = new Array;
	while (child)
	{
		steps[steps.length] = child.UniqueID;
		child = child.nextSibling;
	}
	if (steps.length)
		oRule.selectSingleNode('Steps').text = DelimitList(steps);
}

function FindOwningRule(unique_id)
{
	var child = oRulesNode.firstChild;
	var re = new RegExp('[^0-9]+'+ unique_id +'[^0-9]*');
	while (child)
	{
		if (re.test(child.selectSingleNode('Steps').text))
			return child;
		child=child.nextSibling;
	}
}

function Insert(str, target)
{
	var re = new RegExp('\\{0\\}', 'g');
	return target.replace(re, str);
}

function InsertMultiple(str_array, string)
{
	var i=0;
	while (i < str_array.length)
	{
		var re = new RegExp('\\{'+i+'\\}', 'g');
		string = string.replace(re, str_array[i++]);
		//'{'+i+'}')
	}
	return string;
}

function Pad(str)
{
	var retval = ' {0} ';
	return retval.replace('{0}', str);
}

function ClearOldWhenInfo(oRule, sWhenOption, bHours, bDays, bDate)
{
	if (sWhenOption != 'availability')
		oRule.selectSingleNode('WhenAvail').text = '-1';
	
	if (sWhenOption != 'status')
		oRule.selectSingleNode('WhenCompStatus').text = '';
		
	if (!bHours)
	{
		oRule.selectSingleNode('WhenTimeMinuteStart').text = '0';
		oRule.selectSingleNode('WhenTimeMinuteStop').text = '0';
	}
	if (!bDays)
		oRule.selectSingleNode('WhenTimeDays').text = '0';
		
	if (!bDate)
	{
		oRule.selectSingleNode('WhenTimeMonthStart').text = '0';
		oRule.selectSingleNode('WhenTimeDayStart').text = '0';
		oRule.selectSingleNode('WhenTimeMonthStop').text = '0';
		oRule.selectSingleNode('WhenTimeDayStop').text = '0';
	}
}

function BuildTimeString(sPrefix, bFormatMilitary)
{
	var sHour 	= getObj(sPrefix+'_hours').value;
	var sMin 	= getObj(sPrefix+'_min').value;
	var sAmPm 	= getObj(sPrefix+'_ampm').value;
	if (bFormatMilitary)
	{
		sHour = (parseFloat(sAmPm)) ? (parseFloat(sHour) + parseFloat(sAmPm)) : sHour;
		return (sHour+':'+sMin);
	}
	else
		return (parseFloat((sHour=='00')?'12':sHour) +':'+sMin +((parseFloat(sAmPm))?' PM':' AM'));
}

function BuildDateString(sPrefix)
{
	var oSelectMonth = getObj(sPrefix+'_month');
	var oSelectDay = getObj(sPrefix+'_day');
	return (PrependString(oSelectMonth.value, '0', 2) +'/'+ PrependString(oSelectDay.options[oSelectDay.selectedIndex].text, '0', 2))
}

var oTARRWOobj, oTARRWAobj;

function MatchingWhoWhenInfoInExistingRule(oRule)
{
	var new_who_when_str = BuildWhoWhenParameterString(oRule);
							
	var child = oRulesNode.firstChild;
	while (child)
	{
		if (child.selectSingleNode('UniqueID').text != oRule.selectSingleNode('UniqueID').text)
		{
			if (new_who_when_str == BuildWhoWhenParameterString(child))
			{
				RuleError(text('DLG/RR/MATCH_WHO_WHEN_RULE'),0);
				return true;
			}
		}
		child = child.nextSibling;
	}
	
	return false;
}

function BuildWhoWhenParameterString(oRule)
{
	var string='', i=0, xpaths = new Array( 'WhoType', 'WhoParam', 
							'WhenCompStatus', 'WhenLocation', 'WhenTimeMinuteStart', 'WhenTimeMinuteStop', 
							'WhenTimeMonthStart', 'WhenTimeDayStart', 'WhenTimeMonthStop', 'WhenTimeDayStop', 
							'WhenTimeDays', 'WhenAvail');
							
	while (xpaths[i])
		string += oRule.selectSingleNode(xpaths[i++]).text;
	
	return string;
}

function ValidateRule(oRule)
{
	// who validation
	var oSelectedWhoRadio = GetSelectedRadio('rr_who_type');
	if (!oSelectedWhoRadio)
	{
		RuleError(text('DLG/RR/SEL_WHO'), 0);
		return false;
	}
	else 
	{
		switch( parseFloat(oSelectedWhoRadio.value) )
		{
			case ROUTINGRULE_WHOTYPE_CONTACT:
				if (!oTARRWOobj) {
					RuleError(text('DLG/RR/SEL_WHO_CON'), 0);
					return false;
				}
				break;
				
			case ROUTINGRULE_WHOTYPE_CUSTOM:
				if (!IsValid(getObj('rr_who_custom_num'))) {
					RuleError(text('DLG/RR/SEL_WHO_NUM'), 0);
					return false;
				}
				break;
		}
	}
	
	// when validation
	var oSelectedWhenRadio = GetSelectedRadio('rr_when_type');
	var oSelectedWhenAvailableRadio = GetSelectedRadio('rr_when_type_avail');
	if (!oSelectedWhenRadio)
	{
		RuleError(text('DLG/RR/SEL_WHEN'), 1);
		return false;
	}
	else if (oSelectedWhenRadio.value=='availability' && !oSelectedWhenAvailableRadio)
	{
		RuleError(text('DLG/RR/SEL_WHEN_AV'), 1);
		return false;
	}
	
	// time checkboxes
	if (getObj('rr_when_type_hours').checked)
	{
		var sTimeStart = BuildTimeString('rr_when_time_start', true);
		var sTimeStop = BuildTimeString('rr_when_time_stop', true);
		if (sTimeStart == sTimeStop)
		{
			RuleError(text('DLG/RR/SEL_WHEN_NOTIME'), 1);
			return false;
		}
	}
	
	// day checkboxes
	if (getObj('rr_when_type_days').checked)
	{
		if (!getObj('rr_when_day_mon').checked &&
			!getObj('rr_when_day_tue').checked &&
			!getObj('rr_when_day_wed').checked &&
			!getObj('rr_when_day_thu').checked &&
			!getObj('rr_when_day_fri').checked &&
			!getObj('rr_when_day_sat').checked &&
			!getObj('rr_when_day_sun').checked)
		{
			RuleError(text('DLG/RR/SEL_WHEN_DAYS'), 1);
			return false;
		}
	}

	// what validation
	var stepTblBody = table['RREDWA'].body;
	if (stepTblBody.firstChild && stepTblBody.firstChild.UniqueID)
	{
		// prevent first step from hanging up
		var oFirstStep = oStepsNode.selectSingleNode('STEP[UniqueID = "'+ stepTblBody.firstChild.UniqueID +'"]');
		var first_step_type = parseFloat(oFirstStep.selectSingleNode('StepType').text);
		if (first_step_type == _STEPTYPE_HANG_UP)
		{
			RuleError(text('DLG/RR/SEL_WHAT_HANGUP'), 2);
			return false;
		}
		
		var child = stepTblBody.firstChild;
		while (child)
		{
			var oStep = oStepsNode.selectSingleNode('STEP[UniqueID = "'+ child.UniqueID +'"]');
			// if not the last child
			if (child && child.nextSibling && IsTerminatingStep(oStep))
			{
				RuleError(Insert(child.childNodes[1].innerText.charAt(0), text('DLG/RR/SEL_WHAT_TERMWHAT')), 2);
				return false;
			}
			// last child
			else if (child && !child.nextSibling)
			{
				var step_type = parseFloat(oStep.selectSingleNode('StepType').text);
				if (step_type == _STEPTYPE_PLAY_GREETING)
				{
					RuleError(text('DLG/RR/SEL_WHAT_GREET'), 2);
					return false;
				}
				// not a terminating step
				else if (!IsTerminatingStep(oStep))
				{
					var obj_setup = new Array(new Array('checked', 'default'));
					var retVal = Dialog(text('DLG/RR/SEL_WHAT_RESOLVE'), 9, null, obj_setup);
					var tVals = ParseDelimitedList(retVal);
					if (eval(tVals[0]))
					{
						switch (tVals[1])
						{
							case 'change_duration':
								var aSteps = ParseDelimitedList(oRule.selectSingleNode('Steps').text);
								var oOldStep = oStep.cloneNode(true);
								oStep.selectSingleNode('Duration').text=0;
								CallControlMethod('EditXMLObject', oOldStep, oStep);
								break;
								
							case 'add_voicemail':
								CreateTerminatingStep(oRule, 1);
								break;
								
							case 'add_hangup':
								CreateTerminatingStep(oRule, 0);
								break;
								
							default:
								return false;
						}
					}
					else
						return false;
				}
			}
			
			child = child.nextSibling;
		}
	}
	else
	{
		RuleError(text('DLG/RR/SEL_WHAT_NOWHAT'), 2);
		return false;
	}
	
	return true;
}

function IsTerminatingStep(oStep)
{
	step_type = parseFloat(oStep.selectSingleNode('StepType').text);
	// if the step types which could be terminating with no duration
	if (step_type == _STEPTYPE_SEND_TO_CURRENT_LOCATION || 
 		step_type == _STEPTYPE_SEND_TO_LOCATION ||
	 	step_type == _STEPTYPE_SEND_TO_CONTACT ||
	 	step_type == _STEPTYPE_SEND_TO_ACCOUNT ||
	 	step_type == _STEPTYPE_SEND_TO_DEVICE )
		{
			// if the final step contains a specified duration, not a terminating step
			if (parseFloat(oStep.selectSingleNode('Duration').text))
				return false;
			return true;
		}
	// terminating steps
	if (step_type == _STEPTYPE_FIRST_TERMINATING_STEP || 
 		step_type == _STEPTYPE_TRANSFER_TO_VOICEMAIL ||
	 	step_type == _STEPTYPE_TRANSFER_TO_ACCOUNT ||
	 	step_type == _STEPTYPE_HANG_UP )
		return true;
	return false;
}

function RuleError(msg, num)
{
	tab['RRED'].head.children[num].click();
	Dialog(msg, 0);
}

function CreateTerminatingStep(oRule, type)
{
	var oStep = CreateNewStep();
	switch (type)
	{
		case 0:
			oStep.selectSingleNode('StepType').text = _STEPTYPE_HANG_UP;
			break;
			
		case 1:
			oStep.selectSingleNode('StepType').text = _STEPTYPE_TRANSFER_TO_VOICEMAIL;
			break;
	}
	oStep.selectSingleNode('UniqueID').text = 'TERMINATING_STEP';
	AssociateStepWithCurrentRule(oStep);
	oRule.setAttribute('awaitingStep', 'true');
	oStepsNode.appendChild(oStep);
	table['RREDWA'].refresh();
	CallControlMethod('AddXMLObject', oStep);
}

function DeleteStepsForThisRule(oRule)
{
	var aStepIds = ParseDelimitedList(oRule.selectSingleNode('Steps').text), j=0;
	while (aStepIds[j])
	{
		var step = oStepsNode.selectSingleNode('STEP[UniqueID="'+aStepIds[j++]+'"]');
		if (step)
		{
			oStepsNode.removeChild(step);
			CallControlMethod("DeleteXMLObject", step);
		}
	}
}

function UpdateRoutingRuleWhatSelect(oSelect)
{
	var oCurOpt = oSelect.options[oSelect.selectedIndex];
	var oNumInput = getObj('rr_what_thisloc_number');
	if (oCurOpt.type>0)
	{
		oNumInput.value = FormatPhoneNumber((oCurOpt.type==1) ? oCurOpt.extension : oActNode.selectSingleNode('.//CONTACT/'+oCurOpt.property).text);
		oNumInput.disabled = true;
	}
	else if (oCurOpt.type==0)
	{
		var oCurStep = oStepsNode.selectSingleNode('STEP[UniqueID="'+getObj('formRREDWA').curStep+'"]'), dest = '';
		if (oCurStep)
			dest = RemoveNodePrefix(oCurStep.selectSingleNode('Destination').text);
		oNumInput.value =  (oCurStep && dest && !isNaN(dest)) ? FormatPhoneNumber(dest) : '';
		oNumInput.disabled = false;
	}
}

function ToggleSpecificTimeSelectBoxes(oRadio)
{
	var bDisabled = (oRadio.value=='any') ? true:false;
	getObj('rr_when_time_start_hours').disabled = bDisabled;
	getObj('rr_when_time_start_min').disabled 	= bDisabled;
	getObj('rr_when_time_start_ampm').disabled 	= bDisabled;
	getObj('rr_when_time_stop_hours').disabled 	= bDisabled;
	getObj('rr_when_time_stop_min').disabled 	= bDisabled;
	getObj('rr_when_time_stop_ampm').disabled 	= bDisabled;
}

var b_CHECK_ALL=1;
function ToggleDaysOfWeekCheckboxes()
{
	ConfigureDaysOfWeekCheckboxes(false, ((b_CHECK_ALL)?127:0));
	getObj('rr_when_dow_toggle').innerText = (b_CHECK_ALL) ? text('RR/UCHK_ALL') : text('RR/CHK_ALL');
	b_CHECK_ALL = 1-b_CHECK_ALL;
}

function ConfigureDaysOfWeekCheckboxes(bReturnBitmask, num)
{
	var _RULE_WHENTIMEDAYS_SUNDAY     = new Number(0x00000001);
	var _RULE_WHENTIMEDAYS_MONDAY     = new Number(0x00000002);
	var _RULE_WHENTIMEDAYS_TUESDAY    = new Number(0x00000004);
	var _RULE_WHENTIMEDAYS_WEDNESDAY  = new Number(0x00000008);
	var _RULE_WHENTIMEDAYS_THURSDAY   = new Number(0x00000010);
	var _RULE_WHENTIMEDAYS_FRIDAY     = new Number(0x00000020);
	var _RULE_WHENTIMEDAYS_SATURDAY   = new Number(0x00000040);
	var _RULE_WHENTIMEDAYS_HOLIDAYS   = new Number(0x00000080);
	
	var oSelMon = getObj('rr_when_day_mon');
	var oSelTue = getObj('rr_when_day_tue');
	var oSelWed = getObj('rr_when_day_wed');
	var oSelThu = getObj('rr_when_day_thu');
	var oSelFri = getObj('rr_when_day_fri');
	var oSelSat = getObj('rr_when_day_sat');
	var oSelSun = getObj('rr_when_day_sun');
	
	if (bReturnBitmask)
	{
		var bt_days = 0;
		if (oSelMon.checked)
			bt_days |= _RULE_WHENTIMEDAYS_MONDAY;
		if (oSelTue.checked)
			bt_days |= _RULE_WHENTIMEDAYS_TUESDAY;
		if (oSelWed.checked)
			bt_days |= _RULE_WHENTIMEDAYS_WEDNESDAY;
		if (oSelThu.checked)
			bt_days |= _RULE_WHENTIMEDAYS_THURSDAY;
		if (oSelFri.checked)
			bt_days |= _RULE_WHENTIMEDAYS_FRIDAY;
		if (oSelSat.checked)
			bt_days |= _RULE_WHENTIMEDAYS_SATURDAY;
		if (oSelSun.checked)
			bt_days |= _RULE_WHENTIMEDAYS_SUNDAY;
		return bt_days;
	}
	else
	{
		oSelMon.checked = (num & _RULE_WHENTIMEDAYS_MONDAY);
		oSelTue.checked = (num & _RULE_WHENTIMEDAYS_TUESDAY);
		oSelWed.checked = (num & _RULE_WHENTIMEDAYS_WEDNESDAY);
		oSelThu.checked = (num & _RULE_WHENTIMEDAYS_THURSDAY);
		oSelFri.checked = (num & _RULE_WHENTIMEDAYS_FRIDAY);
		oSelSat.checked = (num & _RULE_WHENTIMEDAYS_SATURDAY);
		oSelSun.checked = (num & _RULE_WHENTIMEDAYS_SUNDAY);
	}
}

function AddStep()
{
	ResetStepForm();
	ToggleAddRoutingRuleStep();
	getObj('formRREDWA').type='new';
}

function ToggleAddRoutingRuleStep()
{
	var oForm = getObj('formRREDWA');
	bFormVisible = (oForm.style.display=='');
	if (bFormVisible)
	{
		Hide('formRREDWA');
		table['RREDWA'].refresh();
		Show('tableRREDWA');
		SetButtons('RREDWA');
	}
	else
	{
		Hide('tableRREDWA');
		Show('formRREDWA');
		SetButtons('RREDWASA');
		UpdateStepFormTitle();
	}

	if (curStepRow)
	{
		var cur_row = getObj(curStepRow.id);
		if (cur_row)
			cur_row.style.backgroundColor = HIGHLIGHTED_ROW_COLOR;
		
	}
}

function UpdateStepFormTitle()
{
	var oForm = getObj('formRREDWA'), title, num;
	if (oForm.curStep)
	{
		title = text('RR/WHAT_TI_EDIT');
		var oRow = getObj('rowRREDWA'+ oStepsNode.selectSingleNode('STEP[UniqueID="'+oForm.curStep+'"]').selectSingleNode('UniqueID').text);
		num = GetRowIndex(oRow) + 1;
	}
	else
	{
		title = text('RR/WHAT_TI_ADD');
		var num_rows = table['RREDWA'].body.childNodes.length;
		// the table could contain a single row indicating there are no steps for this rule
		if (num_rows == 1 && !table['RREDWA'].body.childNodes[0].id)
			num_rows = 0;
		num = num_rows + 1;
	}
	oForm.firstChild.innerHTML = ToUpper(title+' #'+num).replace(' ','<br>');
	oForm.firstChild.nextSibling.innerText = title;
	//getObj('RL').children['buttons'].firstChild.className = (num > 1) ? 'button_cell' : 'button_disabled';
	//tracing down to the child item that has the "previous Step" button. If there are no previous steps disable this button.
	getObj('RL').children['buttons'].firstChild.children[1].className = (num > 1) ? 'button_cell' : 'button_disabled';
}

function SetTypeAheadChoiceForRoutingRule(oRow)
{
	var type = oRow.type, sClass, oObj = oSearchNode.selectSingleNode(type+'/CONTACT[UniqueID="'+oRow.UniqueID+'"]');
	
	if (type == 'TARRWO')
	{
		if (oObj.selectSingleNode('ModifyTimeStamp').text != 'Address Book')
		{
			var oABobj = oABNode.selectSingleNode('CONTACT[LinkParameter !="" and LinkParameter="'+oObj.selectSingleNode('LinkParameter').text+'"]');
			if (oABobj)
			{
				oObj = oABobj.cloneNode(true);
				oObj.selectSingleNode('ModifyTimeStamp').text = 'Personal Contacts';
			}
			else
			{
				var sReturn = Dialog(text('DLG/RR/SEL_WHO_ADDTOAB'), 1);
				var tVals = ParseDelimitedList(sReturn);
				if (eval(tVals[0]))
				{
					var oTAObj = oObj.cloneNode(true);
					oTAObj.selectSingleNode('Owner').text = oActNode.selectSingleNode('.//UniqueID').text;
					oTAObj.selectSingleNode('TenantGroup').text = oActNode.selectSingleNode('.//TenantGroup').text;
					AddChildNodes(oABNode, new Array(oTAObj.cloneNode(true)));
					CallControlMethod('AddXMLObject', oTAObj);
					oObj.selectSingleNode('ModifyTimeStamp').text = 'Personal Contacts';
					table['TARRWO'].refresh();
					table['AB'].refresh();
				}
				else
					return;
			}
		}
		oTARRWOobj = oObj.cloneNode(true);
	}
	else if (type == 'TARRWA')
		oTARRWAobj = oObj.cloneNode(true);
	
	DisplayRuleStepTarget(oObj, type);
}

function DisplayRuleStepTarget(oObj, type, locType)
{
	var src='pix', sHTMLobj='', name='(not found)', bInAddressBook=false;
	if (oObj)
	{
		bInAddressBook = (type=='TARRWO' || oObj.selectSingleNode('ModifyTimeStamp').text=='Personal Contacts');
		var link_type = oObj.selectSingleNode('LinkType').text;
		switch (link_type)
		{
			case 'A':
				src = 'iAct';
				break;
			
			case 'D':
				src = 'iKeyset';
				break;
		}
		name = oObj.selectSingleNode('FirstName').text +' '+ oObj.selectSingleNode('LastName').text;
		if (name.length == 1)
		{
			name = oObj.selectSingleNode('Company').text;
			src = 'iBusiness';
		}
		if (bInAddressBook)
		{
			switch (link_type)
			{
				case 'A':
					src = 'iContactA';
					break;
				
				case 'D':
					src = 'iContactD';
					break;
					
				default:
					src = (!oObj.selectSingleNode('FirstName').text && !oObj.selectSingleNode('LastName').text) ? 'iContactB' : 'iContact';
			}
		}
	}
		
	// Build drop box for phone number selection
	if (type == 'TARRWA' && (link_type=='A' || bInAddressBook))
		sHTMLobj = BuildTargetNumberSelect(oObj, locType);

	getObj('rr_target_'+type).innerHTML = '<img src=\"img/'+src+'.gif\" class=\"icon\" style=\"margin:0px 5px;vertical-align:middle\"/>'+ name + sHTMLobj;

	var oLocNumberSelect = getObj('rr_what_phonenumber');
	
	if (oLocNumberSelect && !oLocNumberSelect.options.length)
	{
		Dialog(text('DLG/RR/NO_CON_PHONE'),0);
		getObj('rr_target_'+type).innerHTML = '';
		return;
	}
	
	Show('rr_target_'+type);

	if (oLocNumberSelect)
	{
		if (IsNum(locType))
			SetSelectIndex(oLocNumberSelect, locType, 2, 'type');
		UpdateTargetStepOptions(oLocNumberSelect);
	}
	
	//Hide(type);
}

function BuildTargetNumberSelect(oObj, locType)
{
	var x="<?xml version='1.0'?>";
	x+= "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/TR/WD-xsl\">";
	x+= "<xsl:template match=\".\">";
	x+=		"<select id=\"rr_what_phonenumber\" class=\"rr_select\" onclick=\"UpdateTargetStepOptions(this)\">";
	x+=		"<xsl:if test=\"LinkType[. = 'A']\"><option type=\"-1\">"+text('CS/CUR_LOC')+"</option></xsl:if>";

	var aNumbers = oRoot.selectNodes("CONTACT_FIELDS/FIELD[@locType and @type='TYPE_STRING_PHONE']"), j=0;
	while(aNumbers[j])
	{
		// only display phone numbers that are not blank
		x+=	"<xsl:if test=\""+aNumbers[j].getAttribute("name")+"[. != '']\">";
		x+=		"<option type=\""+ aNumbers[j].getAttribute("locType") +"\">"+ aNumbers[j].text +" (<xsl:value-of select=\""+aNumbers[j++].getAttribute("name")+"\"/>)</option>";
		x+=	"</xsl:if>";
	}
	x+=		"</select>";
	x+=		"<div id=\"rr_what_phonenumber_description\">";
	if (oObj.selectSingleNode('.//LinkType').text=='A' && locType==-1)
		x+= "(Control will be transfered to this account's routing rules)";
	x+=		"</div>";
	x+= "</xsl:template>";
	x+= "</xsl:stylesheet>";
	
	xTmp.loadXML(x);
	return oObj.transformNode(xTmp);
}

function UpdateTargetStepOptions(oSelect)
{
	var type = oSelect.options[oSelect.selectedIndex].type, string='';
	if (type==-1)
	{
		Hide('rr_duration');
		string+='(Control will be transfered to this account\'s routing rules.)';
	}
	else
		Show('rr_duration');
		
	getObj('rr_what_phonenumber_description').innerText = string;
}

/*
<STEP>
	<DN></DN>
	<UniqueID></UniqueID>
	<Owner></Owner>
	<OwnerTenantGroup></OwnerTenantGroup>
	<StepType>-842150451</StepType>
	<Destination></Destination>
	<Duration>-842150451</Duration>
	<Greeting></Greeting>
	<ScreenCall>TRUE</ScreenCall>
</STEP>
*/

var _STEPTYPE_PLAY_GREETING           	=  1;
var _STEPTYPE_SEND_TO_CURRENT_LOCATION	= 10;
var _STEPTYPE_SEND_TO_LOCATION         	= 11;
var _STEPTYPE_SEND_TO_DEVICE          	= 12;
var _STEPTYPE_SEND_TO_CONTACT         	= 13;
var _STEPTYPE_SEND_TO_ACCOUNT		= 14;

// These steps are terminating steps:
var _STEPTYPE_FIRST_TERMINATING_STEP  = 20;
var _STEPTYPE_TRANSFER_TO_VOICEMAIL   = 20;
var _STEPTYPE_TRANSFER_TO_ACCOUNT     = 21;
var _STEPTYPE_HANG_UP                 = 30;

function EditRuleStep(type, sCurID)
{
	ResetStepForm();
	var oStepForm = getObj('formRREDWA'), sTimestamp;
	oStepForm.curStep = sCurID;
	oStepForm.type = 'edit';
	oStep = oStepsNode.selectSingleNode('STEP[UniqueID="'+sCurID+'"]');
	var nStepType = parseFloat(oStep.selectSingleNode('StepType').text);
	var sDestination = oStep.selectSingleNode('Destination').text;
	var nLocationType =  parseFloat(oStep.selectSingleNode('LocationType').text);
	
	var oLocationSelect = getObj('rr_what_location_type');
	var oLocationNumber = getObj('rr_what_thisloc_number');
	var duration = parseFloat(oStep.selectSingleNode('Duration').text);
	if (duration)
	{
		getObj('rr_send_duration').value = duration;
		SetRadio('rr_what_duration_type',0);
	}
	else
		SetRadio('rr_what_duration_type',1);
		
	switch (nStepType)
	{
		case _STEPTYPE_PLAY_GREETING:
		
			var oGreetingsSelect = getObj('rr_what_greeting');
			SetSelectIndex(oGreetingsSelect, oStep.selectSingleNode('Greeting').text, 0);
			SetRadio('rr_what_type', null, _STEPTYPE_PLAY_GREETING);
			break;
			
		
		case _STEPTYPE_SEND_TO_CURRENT_LOCATION:
		
			SetRadio('rr_what_type', null, _STEPTYPE_SEND_TO_CURRENT_LOCATION);
			break;
			

		case _STEPTYPE_SEND_TO_LOCATION:
		
			var nIndex = 0;
			switch (nLocationType)
			{
				// custom location
				case 0:
					nIndex = GetMatchingOptionIndex(oLocationSelect, '0', 2, 'type');
					oLocationNumber.disabled=false;
					break;

				// owned device
				case 1:
					sDestination = RemoveNodePrefix(sDestination);
					nIndex = GetMatchingOptionIndex(oLocationSelect, sDestination, 2, 'extension');
					oLocationNumber.disabled=true;
					break;

				// personal info location
				default:
					nIndex = GetMatchingOptionIndex(oLocationSelect, nLocationType, 2, 'type');
					sDestination = oActNode.selectSingleNode('.//'+oLocationSelect.options[nIndex].property).text;
					oLocationNumber.disabled=true;
					break;
			}
			oLocationSelect.selectedIndex = nIndex;
			oLocationNumber.value = FormatPhoneNumber(sDestination);
			SetRadio('rr_what_type', null, _STEPTYPE_SEND_TO_LOCATION);
			break;
			
		
		case _STEPTYPE_SEND_TO_ACCOUNT:
		case _STEPTYPE_SEND_TO_CONTACT:
		case _STEPTYPE_TRANSFER_TO_ACCOUNT:

			if (nStepType == _STEPTYPE_SEND_TO_CONTACT)
				oObj = oABNode.selectSingleNode('CONTACT[UniqueID="'+sDestination+'"]');
			else if (nStepType == _STEPTYPE_TRANSFER_TO_ACCOUNT || nStepType == _STEPTYPE_SEND_TO_ACCOUNT)
				oObj = oABNode.selectSingleNode('CONTACT[LinkParameter="'+sDestination+'"]');
			
			if (oObj)
			{
				oTARRWAobj = oObj.cloneNode(true);
				oTARRWAobj.selectSingleNode('ModifyTimeStamp').text = 'Personal Contacts';
			}
			else if (!oObj)
			{
				var request_account = GetTemplate('ACCOUNT');
				request_account.selectSingleNode('.//UniqueID').text = sDestination;
				oObj = CallControlMethod('GetObjectSynch', request_account);
				if (oObj)
				{
					oObj = oObj.selectSingleNode('.//CONTACT');
					oObj.selectSingleNode('LinkType').text = 'A';
					oObj.selectSingleNode('LinkParameter').text = oObj.selectSingleNode('UniqueID').text;
					oObj.selectSingleNode('UniqueID').text = oObj.selectSingleNode('DN').text;
					oTARRWAobj = oObj.cloneNode(true);
				}
			}
			
			// configure target display
			SetRadio('rr_what_type', null, _STEPTYPE_SEND_TO_CONTACT);
			DisplayRuleStepTarget(oTARRWAobj, 'TARRWA', nLocationType);
			break;
			
		
		case _STEPTYPE_SEND_TO_DEVICE:
		
			var request_device = GetTemplate('DEVICE');
			var t_vals = sDestination.split(':');
			request_device.selectSingleNode('NodeID').text 	= t_vals[0];
			request_device.selectSingleNode('Extension').text 	= t_vals[1];
			oDev = CallControlMethod('GetObjectSynch', request_device);
			if (oDev)
			{
				oDev = oDev.selectSingleNode('DEVICE');
				var oObj = GetTemplate('CONTACT');
				var sProperty = (oDev.selectSingleNode('PBXSynchedDesc').text) ? 'PBXSynchedDesc' : 'PBXSynchedUsername';
				// populate object with parameters that will be filled into the hidden form elements
				oObj.selectSingleNode('FirstName').text = oDev.selectSingleNode(sProperty).text;
				oObj.selectSingleNode('LinkType').text = 'D';
				oObj.selectSingleNode('LinkParameter').text = oDev.selectSingleNode('NodeID').text +':'+ oDev.selectSingleNode('Extension').text;
				oObj.selectSingleNode('UniqueID').text = oDev.selectSingleNode('DN').text;
				oTARRWAobj = oObj.cloneNode(true);
				DisplayRuleStepTarget(oTARRWAobj, 'TARRWA', nLocationType);
			}
			SetRadio('rr_what_type', null, _STEPTYPE_SEND_TO_CONTACT);
			break;
			
			
		case _STEPTYPE_TRANSFER_TO_VOICEMAIL:
		
			SetRadio('rr_what_type', null, _STEPTYPE_TRANSFER_TO_VOICEMAIL);
			break;
			
			
		case _STEPTYPE_HANG_UP:
		
			SetRadio('rr_what_type', null, _STEPTYPE_HANG_UP);
			break;
	}
	ToggleWhatSearchAndDuration(GetSelectedRadio('rr_what_type'));
	ToggleAddRoutingRuleStep();
}

var saveRule;

function SaveRoutingRuleStep(b_ADD_NEXT_STEP)
{
	var step_type, destination, location_type, greeting, duration=0, link_type, oOldStep;
	var oDuration = getObj('rr_send_duration'), oStepForm = getObj('formRREDWA');
	var oStep = oStepsNode.selectSingleNode('STEP[UniqueID="'+oStepForm.curStep+'"]');

	//Reset saveRule so that saveRoutingRule() is not called. 
	saveRule = 0;

	// if this is a new step
	if (!oStep)
	{
		oStep = CreateNewStep();
		//oStepForm.curStep = oStep.selectSingleNode('UniqueID').text;
	}
	else
		oOldStep = oStep.cloneNode(true);
	
	var oSelectedRadio = GetSelectedRadio('rr_what_type');
	if (!oSelectedRadio)
	{
		Dialog(text('DLG/RR/STEP_CHS_TYPE'), 0);
		return false;
	}
	
	step_type = parseFloat(oSelectedRadio.value);

	switch (step_type)
	{
		// play a greeting
		case _STEPTYPE_PLAY_GREETING:
			var oSelect = getObj('rr_what_greeting');
			if (!oSelect)
			{
				Dialog(text('DLG/RR/STEP_CREATE_GT'), 0);
				return false;
			}
			else
				greeting = oSelect.options[oSelect.selectedIndex].value;
			break;
	
		// chosen from the composite status style drop list
		case _STEPTYPE_SEND_TO_LOCATION:
			var oWhenLocationTypeSelect = getObj('rr_what_location_type');
			var oLocationNumberInput = getObj('rr_what_thisloc_number');
				
			// make sure this object is in the Personal Contacts
			var opt = oWhenLocationTypeSelect.options[oWhenLocationTypeSelect.selectedIndex];
			var location_type = parseFloat(opt.type);
			if (location_type == -2)
			{
				Dialog(text('DLG/RR/STEP_CHS_LOC'), 0);
				return false;
			}
			else if (location_type == 0 && !IsValid(oLocationNumberInput))
			{
				Dialog(text('DLG/RR/STEP_VAL_LOCNUM'), 0);
				return false;
			}
			else if (location_type > 1)
			{
				if (!CheckForValidLocationInObject(oActNode, getObj('rr_what_location_type'), location_type))
					return false;
			}
	
			step_type = _STEPTYPE_SEND_TO_LOCATION;
			switch (location_type)
			{
				case 0: 	destination = StripPhoneNumber(oLocationNumberInput.value); break;
				case 1: 	destination = opt.node+':'+opt.extension; break;
				default: 	destination = ''; break;
			}
			break;
	
		// type ahead result
		case _STEPTYPE_SEND_TO_CONTACT:
		
			if (!oTARRWAobj) {
				Dialog(text('DLG/RR/STEP_CHS_TGT'), 0);
				return false;
			}
			
			var oLocationSelect = getObj('rr_what_phonenumber');
			if (oLocationSelect)
				location_type = oLocationSelect.options[oLocationSelect.selectedIndex].type;
				
			var link_type = oTARRWAobj.selectSingleNode('LinkType').text;
				
			// if it's in our Personal Contacts
			if (oTARRWAobj.selectSingleNode('ModifyTimeStamp').text == 'Personal Contacts')
			{
				step_type = _STEPTYPE_SEND_TO_CONTACT;
				destination = oTARRWAobj.selectSingleNode('UniqueID').text;
				// desire to transfer to an account's current location
				if (link_type == 'A' && location_type == -1)
				{
					step_type = _STEPTYPE_TRANSFER_TO_ACCOUNT;
					destination = oTARRWAobj.selectSingleNode('LinkParameter').text;
					location_type = '0';
				}
				else if (location_type > 1)
				{
					var oABObj = oABNode.selectSingleNode('CONTACT[UniqueID="'+oTARRWAobj.selectSingleNode('UniqueID').text+'"]');
					if (oABObj && !CheckForValidLocationInObject(oABObj, oLocationSelect, location_type))
						return false;
				}
			}
			// it's a send to device or account from a search result
			else
			{
				destination = oTARRWAobj.selectSingleNode('LinkParameter').text;
				switch (link_type)
				{
					case 'D':
						step_type = _STEPTYPE_SEND_TO_DEVICE;
						break;
						
					case 'A':
						step_type = (oLocationSelect && location_type == -1) ? _STEPTYPE_TRANSFER_TO_ACCOUNT : _STEPTYPE_SEND_TO_ACCOUNT;
						break;
				}
			}
			break;
	}
	
	if (step_type == _STEPTYPE_SEND_TO_CURRENT_LOCATION || 
	    step_type == _STEPTYPE_SEND_TO_LOCATION ||
		step_type == _STEPTYPE_SEND_TO_CONTACT ||
		step_type == _STEPTYPE_SEND_TO_ACCOUNT ||
		step_type == _STEPTYPE_SEND_TO_DEVICE )
	{
		var oSelectedDurationRadio = GetSelectedRadio('rr_what_duration_type');
		if (!oSelectedDurationRadio)
		{
			Dialog(text('DLG/RR/STEP_IND_DUR'), 0);
			return false;
		}
		else if (oSelectedDurationRadio.value=='duration')
		{
			if (IsValid(oDuration) && oDuration.value > 4)
				duration = oDuration.value;
			else
			{
				Dialog(text('DLG/RR/STEP_SPEC_DUR'), 0);
				return false;
			}
		}
	}

	oStep.selectSingleNode('StepType').text 	= step_type;
	oStep.selectSingleNode('Destination').text 	= destination;
	oStep.selectSingleNode('LocationType').text = location_type;
	oStep.selectSingleNode('Duration').text 	= duration;
	oStep.selectSingleNode('Greeting').text 	= greeting;
	
	GetStepTargetObject(oStep);
	
	if (oStepForm.curStep)
	{
		CallControlMethod('EditXMLObject', oOldStep, oStep);
		// the table will be refreshed as a result of the add step below if a new step is being created
		
	}
	else
	{
		oStepsNode.appendChild(oStep.cloneNode(true));
		CallControlMethod('AddXMLObject', oStep);
	}
	
	table['RREDWA'].refresh();
	
	if (!b_ADD_NEXT_STEP)
	{
		ToggleAddRoutingRuleStep();
		//setTimeout("SaveRoutingRule()", 1000);

		//only in cases where you are editing an existing routing rule we can safely call saveroutingrule().
		if (oStepForm.curStep) 
			SaveRoutingRule();

		// In cases where we are adding steps to a routing rule, We cannot simply call the saveroutingrule() here because we wouldn't have received the Confirmation from server
		//related to the above callControlMethod(). Once we recive the confirmation,along comes the servers call to updateXMLObject()
		//When this function is called the tables table['RR'] and table['RREDWA'] are updated with the correct order of steps.
		// So we wait untill we get a response back from the server and once we get a response back, we use this global variable
		//saveRule to tell us whether it is time to call the saveroutingrule(). We can achieve the same with a timer too, like settimeout()
		//but that implementation would not be correct as we would not know how long to wait. It could depend on various factors
		//like network load, CPU load. So we are better off to wait untill we get the updatexmlObject() from server and then call saveroutingrules()

		saveRule = 1;
	}
	return oStep;
}

function CheckForValidLocationInObject(oObj, oSelect, loc_type)
{
	if (oSelect)
	{
		var oField = oRoot.selectSingleNode('CONTACT_FIELDS/FIELD[@locType="'+ loc_type +'"]');
		var value = oObj.selectSingleNode('.//'+oField.getAttribute('name')).text;
		if (!value)
		{
			Dialog(Insert(oField.text, ((oObj.nodeName=='ACCOUNT')?text('DLG/INVAL_PI_NUM'):text('DLG/INVAL_AB_NUM'))), 0);
			var opt = oSelect.options.firstChild;
			while (opt.type != loc_type)
				opt = opt.nextSibling;
			if (opt)
				oSelect.options.removeChild(opt);
			return false;
		}
		else return true;
	}
}

//GetRowIndex(oRow)

function NextStep()
{
	var oStepForm = getObj('formRREDWA');
	if (oStepForm.type=='new')
	{
		var oStep = SaveRoutingRuleStep(true);
		if (oStep)
			ResetStepForm();
	}
	else
	{
		var oStep = SaveRoutingRuleStep(true);
		if (oStep)
		{
			var oRow = getObj('rowRREDWA'+ oStep.selectSingleNode('UniqueID').text);
			if (oRow && oRow.nextSibling)
			{
				EditRuleStep('RREDWA', oRow.nextSibling.UniqueID);
				ToggleAddRoutingRuleStep();
			}
			else
				ResetStepForm();
		}
	}
}

function PreviousStep()
{
	var oStep = SaveRoutingRuleStep(true);
	if (oStep)
	{
		var oRow = getObj('rowRREDWA'+ oStep.selectSingleNode('UniqueID').text);
		if (oRow && oRow.previousSibling)
		{
			EditRuleStep('RREDWA', oRow.previousSibling.UniqueID);
			ToggleAddRoutingRuleStep();
		}
	}
}

function CreateNewStep()
{
	var date = new Date();
	var oStep = GetTemplate('STEP');
	oStep.selectSingleNode('Owner').text = oActNode.selectSingleNode('.//UniqueID').text;
	oStep.selectSingleNode('OwnerTenantGroup').text = oActNode.selectSingleNode('.//TenantGroup').text;
	oStep.selectSingleNode('UniqueID').text = date.getTime();
	oStep.setAttribute('for', oCurRule.selectSingleNode('UniqueID').text);
	oStep.setAttribute('index', (oStepsNode.selectNodes('STEP[@for="'+oCurRule.selectSingleNode('UniqueID').text+'" and not(@deleted)]').length));
	return oStep;
}

function ResetStepForm()
{
	getObj('formRREDWA').curStep=null;
	getObj('formRREDWA').type='new';
	UpdateStepFormTitle();
	getObj('textEmbeddedTypeAheadSearchTARRWA').value='';
	
	RemoveChildNodes(oSearchNode.selectSingleNode('TARRWA'));
	getObj('textEmbeddedTypeAheadSearchTARRWA').value='';
	search_query = null;
	BuildTable('TARRWA');
	Hide('TARRWA');
	
	getObj('rr_what_location_type').selectedIndex=0;
	getObj('rr_what_thisloc_number').disabled=false;
	getObj('rr_what_thisloc_number').value='';
	getObj('rr_send_duration').value='15';
	getObj('rr_target_TARRWA').innerHTML='';
	Hide('rr_duration');
	UpdateGreetingsSelect();
	
	getObjects('rr_what_type')[0].checked=true;
	getObjects('rr_what_duration_type')[0].checked=true;
}

function DeleteSteps()
{
	var aSteps = oStepsNode.selectNodes('STEP'), i=0;
	while (aSteps[i])
	{
		CallControlMethod('DeleteXMLObject', aSteps[i].cloneNode(true));
		oStepsNode.removeChild(aSteps[i]);
		i++;
	}
}

function DeleteUnsavedNewSteps()
{
	var aSteps = oStepsNode.selectNodes('STEP[@new="true"]'), i=0;
	while (aSteps[i])
	{
		CallControlMethod('DeleteXMLObject', aSteps[i].cloneNode(true));
		oStepsNode.removeChild(aSteps[i++]);
	}
}

function ClearDeletedAttributeFromSteps()
{
	var aSteps = oStepsNode.selectNodes('STEP[@deleted="true"]'), i=0;
	while (aSteps[i])
		aSteps[i++].removeAttribute('deleted');
}

function RemoveDeletedSteps()
{
	var aSteps = oStepsNode.selectNodes('STEP[@deleted="true"]'), i=0;
	while (aSteps[i])
	{
		CallControlMethod('DeleteXMLObject', aSteps[i].cloneNode(true));
		oStepsNode.removeChild(aSteps[i++]);
	}
}

function SetStepDisplayAttributes(oRule)
{
	var rule_id = oRule.selectSingleNode('UniqueID').text;
	var aSteps = ParseDelimitedList(oRule.selectSingleNode('Steps').text), i=0;
	while (aSteps[i])
	{
		var oStep = oStepsNode.selectSingleNode('STEP[UniqueID="'+ aSteps[i] +'"]');
		if (oStep)
		{
			oStep.setAttribute('for', rule_id);
			oStep.setAttribute('index', i);
		}
		i++;
	}
}

function SetStepDisplayAttributesForAllRules()
{
	var oRule = oRulesNode.firstChild;
	while (oRule)
	{
		SetStepDisplayAttributes(oRule);
		oRule = oRule.nextSibling;
	}
	// remove any orphaned steps
	var aOrphanedSteps = oStepsNode.selectNodes('STEP[not(@for)]'), i=0;
	while (aOrphanedSteps[i])
		CallControlMethod('DeleteXMLObject', aOrphanedSteps[i++]);
}

function ClearNewStepAttributes()
{
	var aSteps = oStepsNode.selectNodes('STEP[@for or @index or @new]'), i=0;
	while (aSteps[i])
		aSteps[i++].removeAttribute('new');
}

function AssociateStepWithCurrentRule(oStep)
{
	oStep.setAttribute('new', 'true');
	oStep.setAttribute('for', oCurRule.selectSingleNode('UniqueID').text);
	oStep.setAttribute('index', (oStepsNode.selectNodes('STEP[@for="'+oCurRule.selectSingleNode('UniqueID').text+'"]').length-1));
	table['RREDWA'].refresh();
}

function AppendStepToWaitingRule(oStep)
{
	oTargetRule = oRulesNode.selectSingleNode('RULE[@awaitingStep="true"]');
	if (oTargetRule)
	{
		var oOldRule = oTargetRule.cloneNode(true);
		var step_list = oTargetRule.selectSingleNode('Steps').text;
		oTargetRule.selectSingleNode('Steps').text = step_list.replace('TERMINATING_STEP', oStep.selectSingleNode('UniqueID').text);
		SetStepDisplayAttributes(oTargetRule);
		if (oTargetRule.selectSingleNode('DN').text!='')
			CallControlMethod('EditXMLObject', oOldRule, oTargetRule);
	}
}

function ToggleWhoSearch(oRadio)
{
	if (oRadio.value == ROUTINGRULE_WHOTYPE_CONTACT)
		Show('TARRWO');
	else
		Hide('TARRWO');
}

function ToggleWhatSearchAndDuration(oRadio)
{
	if (oRadio.value == _STEPTYPE_SEND_TO_CURRENT_LOCATION || oRadio.value == _STEPTYPE_SEND_TO_LOCATION)
	{
		Show('rr_duration');
	}
	else if (oRadio.value == _STEPTYPE_SEND_TO_CONTACT)
	{
		var oLocationSelect = getObj('rr_what_phonenumber');
		if (oLocationSelect && oLocationSelect.options[oLocationSelect.selectedIndex].type == -1)
			Hide('rr_duration');
		else
			Show('rr_duration');
	}
	else
		Hide('rr_duration');
		
	if (oRadio.value != _STEPTYPE_SEND_TO_CONTACT)
		Hide('TARRWA');
	else
		Show('TARRWA');
}

function CheckForDayRollover()
{
	getObj('rr_when_type_hours').checked=1;
	// if the stop time is less than the start time
	getObj('rr_time_clarification').innerText = (BuildTimeString('rr_when_time_stop', true) < BuildTimeString('rr_when_time_start', true)) ? 'the next day.' : '';
}

function CheckForYearRollover()
{
	var oSelectStartMonth = getObj('rr_when_date_start_month');
	var oSelectStartDay = getObj('rr_when_date_start_day');
	var oSelectStopMonth = getObj('rr_when_date_stop_month');
	var oSelectStopDay = getObj('rr_when_date_stop_day');
	
	var sDateStart = PrependString(oSelectStartMonth.options[oSelectStartMonth.selectedIndex].value,'0',2) + '/'+ PrependString(oSelectStartDay.options[oSelectStartDay.selectedIndex].text,'0',2);
	var sDateStop = PrependString(oSelectStopMonth.options[oSelectStopMonth.selectedIndex].value,'0',2) + '/'+ PrependString(oSelectStopDay.options[oSelectStopDay.selectedIndex].text,'0',2);
	
	getObj('rr_date_clarification').innerText = (sDateStop < sDateStart) ? 'next year.' : '';
}

// Drag and drop step row functions

var nPrevDragStepRowID;

function enterStepDrag(oRow)
{
	if (!dragObj.UniqueID)
		return;
		
	var oPrevRow = getObj(nPrevDragStepRowID);

	if (oPrevRow && oRow && (oRow.id != nPrevDragStepRowID))
		SetStepRowBorderColor(oPrevRow,0);

	if (oRow && oRow.UniqueID != dragObj.UniqueID && oRow != getObj('rowRREDWA'+dragObj.UniqueID).nextSibling)
	{
		SetStepRowBorderColor(oRow,1);
		dragObj.active=1;
	}
	else if (window.event.srcElement == table['RREDWA'].body)
		dragObj.active=1;
	else
		dragObj.active=0;
	
	nPrevDragStepRowID = (oRow) ? oRow.id : null;
	window.event.cancelBubble=true;
}

function SetStepRowBorderColor(oRow, bIsOver)
{
	if (!oRow)
		return false;
		
	if (dragObj.type=='RREDWA')
		oRow.style.borderTop = (bIsOver) ? '2px solid #9c6' : '';
}

function dropStep(oRow)
{
	var oMoveRow = getObj('row'+dragObj.type+dragObj.UniqueID)
	if (oMoveRow && (dragObj.active || !dragObj.active && window.event.srcElement==table['RREDWA'].body))
	{
		var oTableBody = table[dragObj.type].body;
		if (oRow)
			oTableBody.insertBefore(oMoveRow, oRow);
		else
			oTableBody.insertBefore(oMoveRow);
		window.event.cancelBubble=true;
		ReIndexSteps();
		table['RREDWA'].refresh();
	}
}

function ReIndexSteps()
{
	var child = table['RREDWA'].body.firstChild, i=0;
	while (child)
	{
		var oStep = oStepsNode.selectSingleNode('STEP[UniqueID="'+ child.UniqueID +'"]');
		oStep.setAttribute('index', i++);
		child = child.nextSibling;
	}
}

function dragEnterStepTable()
{
	//window.event.cancelBubble=true;
	SetStepRowBorderColor(getObj(nPrevDragStepRowID), 0);
	//dragObj.active=1;
}
/*
LOCATION_TYPE_CUSTOM       = 0;
LOCATION_TYPE_DEVICE       = 1;
LOCATION_TYPE_WORK_1       = 2;
LOCATION_TYPE_WORK_2       = 3;
LOCATION_TYPE_WORK_MOBILE  = 4;
LOCATION_TYPE_WORK_IP      = 5;
LOCATION_TYPE_HOME_1       = 6;
LOCATION_TYPE_HOME_2       = 7;
LOCATION_TYPE_HOME_MOBILE  = 8;
LOCATION_TYPE_HOME_IP      = 9;
*/

function BuildRuleSelect(type, id, method, param)
{
	var x= "<select class=\"rr_select\" id=\""+id+"\"";
	if (method)
		x+=" onchange=\""+method+"\"";
	x+=">";
	switch (type)
	{
		case 'month':
			var aMonths = oText.selectNodes('LABELS/MONTHS/MONTH'), i=0;
			while(aMonths[i])
				x+= "<option value=\""+aMonths[i].getAttribute('num')+"\">"+aMonths[i++].getAttribute('abbr')+"</option>";
			break;
			
		case 'date':
			var oMonthNode = oText.selectSingleNode('LABELS/MONTHS/MONTH[@abbr="'+param+'"]');
			var nNumDays = parseFloat(oMonthNode.getAttribute('days')), i=1;
			while (i<=nNumDays)
				x+=	"<option>"+(i++)+"</option>";
			break;
			
		case 'hours':
			x+=	"<option value=\"00\">12</option>";
			x+=	"<option value=\"01\">01</option>";
			x+=	"<option value=\"02\">02</option>";
			x+=	"<option value=\"03\">03</option>";
			x+=	"<option value=\"04\">04</option>";
			x+=	"<option value=\"05\">05</option>";
			x+=	"<option value=\"06\">06</option>";
			x+=	"<option value=\"07\">07</option>";
			x+=	"<option value=\"08\">08</option>";
			x+=	"<option value=\"09\">09</option>";
			x+=	"<option value=\"10\">10</option>";
			x+=	"<option value=\"11\">11</option>";
			break;
			
		case 'minutes':
			var i=0,j=0,str;
			while (i<6) {
				while (j<10) {
					str = i+""+(j++);
					x+=	"<option value=\""+str+"\">"+str+"</option>";
				}
				i++;
				j=0;
			}
			break;
			
		case 'ampm':
			x+= "<option value=\"00\">AM</option>";
			x+=	"<option value=\"12\">PM</option>";
			break;
	}
	x+=	"</select>";
	return x;
}

function SetDatesForThisMonth(oMonthSelect)
{
	var oDaySelect = oMonthSelect.nextSibling;
	oMonthNode = oText.selectSingleNode('LABELS/MONTHS/MONTH[@abbr="'+oMonthSelect.options[oMonthSelect.selectedIndex].text+'"]');
	var nNumDays = parseFloat(oMonthNode.getAttribute('days')), i=1;
	oDaySelect.options.length=0;
	while (i<=nNumDays)
	{
		var opt = document.createElement('OPTION');
		opt.text = i++;
		oDaySelect.options.add(opt);
	}
}

// ****************************************************
// *******************  GREETINGS  ********************
// ****************************************************

function AddGreeting()
{
	if (oGreetingsNode.selectSingleNode('GREETING[Filename=""]'))
	{
		Dialog(text('DLG/GT/CREATE_IN_PROGRESS'), 0)
		return;
	}
	getObj('GTFM').type = 'add';
	getObj('GTFM').UniqueID = '';
	getObj('gt_description').value='';
	ToggleGreetingsForm();
	getObj('RLGTHLP').style.display='none';
	HighlightRow();
}

function EditGreeting(sID)
{
	var oObj = oGreetingsNode.selectSingleNode('GREETING[UniqueID="'+sID+'"]');
	getObj('gt_description').value = oObj.selectSingleNode('Description').text;
	getObj('GTFM').UniqueID = sID;
	getObj('GTFM').type = 'edit';
	ToggleGreetingsForm();
}

function SaveGreeting()
{
	var sUniqueID = getObj('GTFM').UniqueID, oOldObj, oDescription = getObj('gt_description');
	var oObj = oGreetingsNode.selectSingleNode('GREETING[UniqueID="'+sUniqueID+'"]');
	var oMatchObj = FindExistingNodeValue(oGreetingsNode, 'Description', oDescription.value);
	
	if (!IsValid(oDescription))
		Dialog(text('DLG/GT/NOVAL'),0);
	else if (oMatchObj && (!oObj || (oObj && oMatchObj.selectSingleNode('UniqueID').text != oObj.selectSingleNode('UniqueID').text)))
		Dialog(text('DLG/GT/NM_MTCH'),0);
	else
	{
		
		if (oObj)
			oOldObj = oObj.cloneNode(true);
		else
		{
			oObj = GetTemplate('GREETING');
			oObj.selectSingleNode('Owner').text = oActNode.selectSingleNode('.//UniqueID').text;
			oObj.selectSingleNode('TenantGroup').text = oActNode.selectSingleNode('.//TenantGroup').text;
		}
		
		oObj.selectSingleNode('Description').text = oDescription.value;
		
		if (getObj('GTFM').type == 'add')
		{
			oGreetingsNode.appendChild(oObj);
			CallControlMethod('AddXMLObject', oObj);
		}
		else
			CallControlMethod('EditXMLObject', oOldObj, oObj);
			
		table['GT'].refresh();
		ToggleGreetingsForm();
	}
}

function ToggleGreetingsForm()
{
	var oForm = getObj('GTFM');
	var bVisible = (oForm.style.display=='');
	if (bVisible)
	{
		getObj('GTFM').UniqueID = null;
		Hide('GTFM');
		SetButtons('GT');
		getObj('RLGTHLP').style.display='';
	}
	else
	{
		oForm.firstChild.innerText = (oForm.type=='add') ? 'Add Greeting' : 'Edit Greeting';
		Show('GTFM');
		//getObj('GT').children['buttons'].innerHTML='';
		getObj('RL').children['buttons'].innerHTML='';
		SetFocus('gt_description');
	}
}

function UpdateGreetingsSelect()
{
	var oSpan = getObj('rr_what_greeting_select');
	if (oSpan)
		oSpan.innerHTML = CreateHTML('rr_what_greeting_select',1,oRoot);
}


// ****************************************************
// *******************  CALL LIST  ********************
// ****************************************************

function PlaceCall(number, unique_id)
{
	var args, del_caller_info='';
	if (!number)
		number = getObj('cc_place_call_number').value;
	if (number)
	{
		if (unique_id)
		{
			var oContact = oABNode.selectSingleNode('CONTACT[UniqueID="'+unique_id+'"]');
			if (!oContact)
				oContact = oSearchNode.selectSingleNode('*/CONTACT[UniqueID="'+unique_id+'"]');
			if (oContact)
			{
				args=new Array;
				args[0] = oContact.selectSingleNode('FirstName').text;
				args[1] = oContact.selectSingleNode('LastName').text;
				args[2] = oContact.selectSingleNode('Company').text;
				args[3] = DelimitList(new Array(oContact.selectSingleNode('LinkType').text, oContact.selectSingleNode('LinkParameter').text));
				args[4] = unique_id;
				del_caller_info = DelimitList(args);
			}
		}
		CallControlMethod('PlaceCall', number, del_caller_info);
	}
}

function AnswerCall(call_id)
{
	if (!call_id)
		call_id = GetHighlightedCallID();
	
	var oCall = oCallListNode.selectSingleNode('.//*[CallID="'+call_id+'"]');
	
	if (oCall && CallOperationEnabled(oCall, CALLFLAGS_OPERATION_SUPPORTED_ANSWER))
	{
		CallControlMethod('AnswerCall', BuildDelimitedEndpointString(call_id));
		ResetNotification();
	}
}

function HoldCall(call_id)
{
	if (!call_id)
		call_id = GetHighlightedCallID();
		
	if (call_id)
		CallControlMethod('HoldCall', BuildDelimitedEndpointString(call_id));
}

/*
<MSG_WAITING>
	<NodeID>1</NodeID>
	<Extension>1003</Extension>
	<SourceAccountID>eklee</SourceAccountID>
	<SourceName>EK Lee</SourceName>
	<SourceNodeExtension>1:1006</SourceNodeExtension>
	<Mailbox />
	<NumberOfMessages>1</NumberOfMessages>
</MSG_WAITING>
*/

function StationMessageCall(call_id)
{
	if (!call_id)
		call_id = GetHighlightedCallID();
		
	if (call_id)
	{
		var device_id = GetTargetNumberFromCallObject(oCallListNode.selectSingleNode('.//*[CallID="'+call_id+'"]'));
		
		RemoveStationMessageForCalledDevice(device_id);
		
		AddStationMessage(null, null, device_id);
		HangUp(call_id);
	}
}

function VoicemailCall(call_id)
{
	if (!call_id)
		call_id = GetHighlightedCallID();

	if (call_id)
	{
		var device_id = GetTargetNumberFromCallObject(oCallListNode.selectSingleNode('*[CallID="'+call_id+'"]'));

		RemoveStationMessageForCalledDevice(device_id);
		
		CallControlMethod('TransferCallToVMail', DelimitList(new Array(call_id, device_id)));		
	}
}

// if a station message exists for a party which we've 
// returned the call - remove the station message
function RemoveStationMessageForCalledDevice(device_id)
{
	var oMsg = oMsgNode.selectSingleNode('MSG_WAITING[Mailbox="" and SourceNodeExtension="'+device_id+'"]');
	if (oMsg)
	{
		CallControlMethod('DeleteXMLObject', oMsg.cloneNode(true));
		oMsgNode.removeChild(oMsg);
		table['MS'].refresh();
	}
}

function SendCallToVoiceMail(call_id)
{
	if (!call_id)
		call_id = GetHighlightedCallID();
	
	CallControlMethod('TransferCallToVMail', BuildDelimitedEndpointString(call_id));
	ResetNotification();
}

function CallVoicemail(id)
{
	CallControlMethod('PlaceCallToVMail', id);
}


function HangUp(call_id)
{
	if (!call_id)
		call_id = GetHighlightedCallID();

	var method, device_id, state;
	var oCall = oCallListNode.selectSingleNode('*[CallID="'+call_id+'"]');
	// if the call is at root level in the call list
	if (oCall)
	{
		device_id = oCall.selectSingleNode('NodeID').text+':'+oCall.selectSingleNode('Extension').text;
		// if this call is a conference, yet not initiated by this user, set the type so 'DropConnection'
		if (oCall.nodeName == 'CONFERENCE_CALL' && device_id != oCall.selectSingleNode('ControllingDeviceID').text)
			method = 'DropConnection';
		else
			method = 'DropCall';
			
	}
	// otherwise it's an embedded conference call
	else
	{
		var oConference = oCallListNode.selectSingleNode('CONFERENCE_CALL[*/CALL/CallID="'+call_id+'"]');
		if (oConference)
		{
			state = oConference.selectSingleNode('State').text; 
			// can't drop a holding or recalling conference
			if (state == 'H' || state == 'R')
				Dialog(text('CL/NODROP')); //FormatMultilineAlert(
			else
			{
				oCall = oConference.selectSingleNode('*/CALL[CallID="'+call_id+'"]');
				method = (oCall.nodeName == 'CONFERENCE_CALL') ? 'DropCall' : 'DropConnection';
				device_id = GetTargetNumberFromCallObject(oCall, null, true, false);
			}
		}
	}
	if (method)
		CallControlMethod(method, DelimitList(new Array(call_id, device_id)));
		
	if (window.event)
	{
		window.event.returnValue=false;
		window.event.cancelBubble=true;
	}
}

function HighlightCallList(selected_rows)
{
	if (selected_rows && selected_rows.length)
	{
		var i=0;
		while (selected_rows[i])
		{
			var cur_row = getObj(selected_rows[i++].id);
			if (cur_row)
				cur_row.style.backgroundColor = HIGHLIGHTED_ROW_COLOR;
			// if the highlighted row is no longer connected and there's no other
			// rows, clear out the array so the logic below engages and break out of while loop
			else if (!cur_row && !selected_rows[i])
			{
				selected_rows = null;
				break;
			}
		}
	}
	
	if (!selected_rows || selected_rows.length==0)
	{
		var call_id, call_state;
		if (oCallListNode.childNodes.length==1)
			call_id = oCallListNode.firstChild.selectSingleNode('CallID').text;
		else
		{
			var active_calls 	= oCallListNode.selectNodes('*[State="C"]');
			var ringing_calls	= oCallListNode.selectNodes('*[State="A"]');
			if (active_calls.length>0)
				call_id = active_calls[0].selectSingleNode('CallID').text;
			else if (ringing_calls.length>0)
				call_id = ringing_calls[0].selectSingleNode('CallID').text;
		}
		
		var row = getObj(GetIDStringForCallListRow(call_id));
		if (row)
			row.firstChild.click();
	}
	
	ConfigureCallListButtons();
}

function GetIDStringForCallListRow(call_id)
{
	if (!call_id)
		return null;
	var oCall = oCallListNode.selectSingleNode(Insert(call_id, './/*[CallID="{0}"]'));
	return ('rowCL'+oCall.selectSingleNode('NodeID').text + oCall.selectSingleNode('Extension').text + oCall.selectSingleNode('CallID').text);
}

/*function ClickRow(str)
{
	window.setTimeout('getObj("'+str+'").firstChild.click();',250);
}*/

function GetHighlightedCallID()
{
	var call_id;
	var rows = GetHighlightedRows(table['CL'].body);
	if (!rows || rows.length==0 || rows.length > 1)
		Dialog(text('DLG/CL/ONE'),0);
	else
		call_id = rows[0].UniqueID;
	return call_id;
}

function BuildDelimitedEndpointString(call_id)
{
	var oCall = oCallListNode.selectSingleNode('.//*[CallID="'+call_id+'"]'), ret_str="";
	if (oCall)
	{
		var device_id = oCall.selectSingleNode('NodeID').text+':'+oCall.selectSingleNode('Extension').text;
		ret_str = DelimitList(new Array(call_id, device_id));
	}
	return ret_str;
}

function GetTargetNumberFromCallObject(oCall, bFormatNum, bReturnTrunkNum, bInternalToInteralUseOwner)
{
	if (oCall.nodeName=='CONFERENCE_CALL')
		return '';
		
	var x_path, x_value, num;
	var node_colon_ext = oCall.selectSingleNode('NodeID').text +':'+ oCall.selectSingleNode('Extension').text;
	var CALLING_DEVICE_TYPE 	= oCall.selectSingleNode('CallingDeviceType').text;
	var ANSWERING_DEVICE_TYPE 	= oCall.selectSingleNode('AnsweringDeviceType').text;
	
	// if either device is external, then it's an incoming call from an outside number.
	if (CALLING_DEVICE_TYPE == 'E' || ANSWERING_DEVICE_TYPE == 'E')
	{
		// KLUDGE - need to return outside trunk number - being populated in the AnsweringInternalExt property
		if (bReturnTrunkNum)
			x_path = (oActNode.selectSingleNode('.//Devices[LIST//String="'+oCall.selectSingleNode('CallingInternalExt').text+'"]')) ? 'AnsweringInternalExt' : 'CallingInternalExt';
		// This is a call between an internal number (us) and the CO
		else
			x_path = (oCall.selectSingleNode('CallingOutsideNumber').text) ? 'CallingOutsideNumber' : 'AnsweringOutsideNumber';
	}
	// if both calling device type and the answering device type are internal, return the number that doesn't match the user id.
	else if (CALLING_DEVICE_TYPE == 'I' && ANSWERING_DEVICE_TYPE == 'I')
	{
		// If this is an internal to internal non-conference call,
		// its always safe to use our owner ID to drop a connection, or otherwise affect this call.
		if (bInternalToInteralUseOwner)
			x_value = node_colon_ext;
		else
			// if the user id matches the int calling ext, return the int answering ext.
			x_path = (node_colon_ext == oCall.selectSingleNode('CallingInternalExt').text) ? 'AnsweringInternalExt' : 'CallingInternalExt';
	}
	
	num = (x_path) ? oCall.selectSingleNode(x_path).text : x_value;
	
	return (bFormatNum) ? FormatCallListObjPhoneNumber(num) : num;
}

function GetXMLNodeNameForOtherPartyNumber(call_id)
{
	var oCall = oCallListNode.selectSingleNode('CALL[CallID="'+call_id+'"]'), x_path;
	var node_colon_ext = oCall.selectSingleNode('NodeID').text +':'+ oCall.selectSingleNode('Extension').text;
	var CALLING_DEVICE_TYPE 	= oCall.selectSingleNode('CallingDeviceType').text;
	var ANSWERING_DEVICE_TYPE 	= oCall.selectSingleNode('AnsweringDeviceType').text;
	if (CALLING_DEVICE_TYPE == 'E' || ANSWERING_DEVICE_TYPE == 'E')
	{
		x_path = (oCall.selectSingleNode('CallingOutsideNumber').text) ? 'CallingOutsideNumber' : 'AnsweringOutsideNumber';
	}
	// if both calling device type and the answering device type are internal, return the number that doesn't match the user id.
	else if (CALLING_DEVICE_TYPE == 'I' && ANSWERING_DEVICE_TYPE == 'I')
	{
		x_path = (node_colon_ext == oCall.selectSingleNode('CallingInternalExt').text) ? 'AnsweringInternalExt' : 'CallingInternalExt';
	}
	return x_path;
}

function FlagCallFlow(oCall)
{
	var state = oCall.selectSingleNode('State').text;
	var flow = oCall.getAttribute('flow');
	
	if (!flow && (state=='A'||state=='a'||state=='O'||state=='o'))
		flow = (state=='A'||state=='o') ? 'in' : 'out';
	if (flow)
		oCall.setAttribute('flow', flow);
}

function BeginTransfer(call_id)
{
	if (!call_id)
		call_id = GetHighlightedCallID();
		
	if (call_id)
		ViewListMenu('Transfer', call_id);
	
}

function HandleSpecifiedTransfer(transfer_type, call_id)
{
	switch (transfer_type)
	{
		case 'manual':
			var ret_vals = Dialog(text('DLG/CL/TRAN_NUM'), 10);
			var t_vals = ParseDelimitedList(ret_vals);
			if (eval(t_vals[0]) && t_vals[1])
				TransferCall(call_id, t_vals[1]);
			break;
			
		case 'search':
			getObj('cc_type_ahead_search').focus();
			break;
	}
}

function GetTransferTarget(unique_id)
{
	var num, obj = oSearchNode.selectSingleNode('TA/CONTACT[UniqueID="'+ unique_id +'"]');
	if (obj)
	{
		/*switch (obj.selectSingleNode('LinkType').text)
		{
			case 'A':
				var oPrimary = obj.selectSingleNode('Devices//String');
				if (oPrimary)
					num = oPrimary.text;
				break;
				
			case 'D':
				num = obj.selectSingleNode('LinkParameter').text;
				break;
		}*/
		if (!num)
			ViewListMenu('TransferSelect', unique_id);
		else
			TransferHighlightedCall(num);
	}
}

function TransferHighlightedCall(num)
{
	var aRows = GetHighlightedRows(table['CL'].body);
	if (aRows.length==1 || transferObj)
	{
		var callID = (transferObj) ? transferObj.UniqueID : aRows[0].UniqueID;
		TransferCall(callID, num);
		transferObj = null;
	}
	else
		Dialog(text('DLG/CL/TRAN_ONE'),0);
}

function TransferCall(call_id, destination)
{
	if (call_id && destination)
		CallControlMethod('TransferCall', BuildDelimitedEndpointString(call_id), destination);
}

var transferObj;

function TransferDragAndDrop(oRow)
{
	if (oRow && dragObj && oRow.type=='TA' && dragObj.type=='CL')
	{
		getObj('rowCL'+dragObj.UniqueID).click();
		transferObj = dragObj;
		dragObj = null;
		GetTransferTarget(oRow.UniqueID);
	}
}

function BuildCallNotification()
{

//	var x= "<span id=\"Logo\"><img id='ToolbarToggleIcon' style='cursor:hand;float:right;vertical-align:middle;margin:4px 3px' src='img/ChromeToolbarButtonUp.gif' onclick=\"ToggleToolbarDisplay(this)\">";
	var x= "<span id=\"Logo\">";	//*** removed minimize function ***
//	x+= "<img id='ChromeLogo' src='img/UCTextChrome.gif'>";
	x+= "<img id='ChromeLogo' src='img/UC_Transparent.gif'>";
	x+= "</span>";
/*
	x+= "<div style=\"height:5px;width:100px;float:left;display:inline;padding-top:1px;margin:1px;text-align:right\">";
		x+= 	MakeButton('', text('BUTN/HELP'), 'handleHelpButtonClick()','','','invisible_button');
		//x+= "<a href=\"javascript:ViewListMenu('Help')\" style=\"font-weight:normal;\">"+FormatAccessKey(text('BUTN/HELP'))+"</a><br/>";
		//x+= MakeHyperlink(text('BUTN/HELP'), 'HandleFeatureButtonClick()');
	x+= "</div>";
	x+= "<div style=\"height:5px;width:100px;float:left;display:inline;padding-top:1px;margin:1px;text-align:right\">";
		x+= MakeButton('', text('BUTN/LGOFF'), 'CloseOut(true)','','','invisible_button');
	x+= "</div>";
*/
	//Add DIV's for each button so there is enough space to display properly - used original V3 div from above.
	x+= "<div style=\"height:22px;width:100px;float:right;display:inline;padding-top:1px;margin:1px;text-align:right\">";
	x+=     MakeFeatureButton('', text('BUTN/HELP'), 'HandleFeatureButtonClick()');	
	x+= "</div>";
	x+= "<div style=\"height:22px;width:100px;float:right;display:inline;padding-top:1px;margin:1px;text-align:right\">";
	x+=     MakeFeatureButton('', text('BUTN/LGOFF'), 'HandleFeatureButtonClick()');
	x+= "</div>";


	//x+= "<span id=\"CallInformation\" style=\"display:none;height:45px;text-align:center;padding-top:7px;width:100%\"></span>";//margin-right:10px;padding:0px 10px;
	getObj('CallNotification').innerHTML = x;
}

function BuildCEMenu()
{
	var aRootNodes = oComponents.selectNodes("CONTENT[@rootView='1']"); i=0;
	var x="<select id=\"WinCEMenu\" style=\"font-family:Tahoma;font-size:10px;vertical-align:middle;margin:4px 2px\" onchange=\"ToggleLink(null, this.options[this.selectedIndex].value)\">";
	while (aRootNodes[i])
		x+= "<option value=\""+aRootNodes[i].getAttribute('abbr')+"\">"+aRootNodes[i++].text+"</option>";
	return x+"</select>";
}

var b_CLOSE_CALLLIST_WHEN_EMPTY = 0;

function DisplayCallNotification(oCall)
{
	var html = "", name="", name_display = "&nbsp;({0})";
	// this call is ringing in
/*	if (oCall && oCall.selectSingleNode('State').text == 'A')
	{
		var call_id = oCall.selectSingleNode("CallID").text;
		if (oCall.nodeName=='CALL')
		{
			var b_POSITIVE_CALLER_ID = (oCall.selectSingleNode('OtherPartyFirstName').text || oCall.selectSingleNode('OtherPartyLastName').text || oCall.selectSingleNode('OtherPartyCompany').text) ? true : false;
			if (b_POSITIVE_CALLER_ID)
				name = (oCall.selectSingleNode('OtherPartyFirstName').text || oCall.selectSingleNode('OtherPartyLastName').text) ? (oCall.selectSingleNode('OtherPartyFirstName').text +' '+ oCall.selectSingleNode('OtherPartyLastName').text) : oCall.selectSingleNode('OtherPartyCompany').text;
			name += (b_POSITIVE_CALLER_ID) ? " <img src=\"img/iPosCallerID.gif\" class=\"icon\"/>" : oCall.selectSingleNode('CallingInternalName').text;
		}
		name = (name) ? Insert(name, name_display) : name;
		html += "<span style='height:10px;'>* CALL RINGING"+ name +"&nbsp;*</span>";
		
		AlertUserToIncomingCall();
	}
	getObj('CallInformation').innerHTML = html;*/
	
	// if there's a call, we're not in toolbar mode and the call control is hidden, open up the call control
	if (oCall)
	{
		//If the DIV thats being displayed is already AC(Active Call) then do not update the variable "sTempDivBeforeActiveCall", 
		//thats because, when you tear down the call, "sTempDivBeforeActiveCall" DIV is displayed. And because the call is already taken down, there is no more AC DIV to show.
     		if(sCurDiv!="AC")
		{
			sTempDivBeforeActiveCall = sCurDiv;
			getObj('vl_AC').style.display = "";
			ToggleLink(this,"AC");
		}
		b_CLOSE_CALLLIST_WHEN_EMPTY = 1;
		//getObj('cc_call_control_toggle_icon').click();
		ToggleCallControl(1);
		//SetCallControlDisplay(2);
/*		if (getObj('CC').style.display == 'none')
		{	

		}
		else
		{			
			ConfigureCallControlDisplay();
		}*/
	}
}

function AlertUserToIncomingCall()
{
	if (!call_notification_timer)
	{
		Hide('Logo');
		//Show('CallInformation');
		FlashCallNotification();
		call_notification_timer = window.setInterval('FlashCallNotification();',500);
	}
}

//sTempDivBeforeActiveCall-Always stores the sub-DIV that was displayed before the call arrived.
//sPreviousDiv-Always stores the main DIV that was displayed before ED DIV was shown.


function ResetNotification()
{
	//Hide('CallInformation');
	//Show('Logo');
	//color_state=0;
	call_notification_timer=0;
	//getObj('CallInformation').innerHTML = '';
	//getObj('CallInformation').style.color = '';
	if (!oCallListNode.hasChildNodes())
	{
		if(sCurDiv == "AC")
		{
			//If the main menu item thats being displayed(sTempDivBeforeActiveCall) before the toggle to AC is ED,
			//then this div is removed from the display before the toggle happens.
			// therefore we cannot return back to the ED div. Instead we can only come back to the main menu item.
			if(sTempDivBeforeActiveCall == 'ED')
				sTempDivBeforeActiveCall = sPreviousDiv;
			ToggleLink(this,sTempDivBeforeActiveCall);
		}
		getObj('vl_AC').style.display = "none";
	}
}

function ResetCallListState()
{
	if (!oCallListNode.hasChildNodes())
	{
		if (b_CLOSE_CALLLIST_WHEN_EMPTY)
			CloseCallControl();
		else
			ConfigureCallControlDisplay();
		if (oSearchNode.selectSingleNode('TA').hasChildNodes())
		{
			alert("This case has to be handled - 1");
			//table['TA'].refresh();
		}
	}
	if (!oCallListNode.selectSingleNode('*[State="A"]'));
	{
	        //When you hang up calls, the AC tab was supposed to go away.
	        //The browser was freezing(locksup) very often when the AC tab goes away
	        // For some reason this seems to be a timing issue.
	        //Introducing this timeout seems to resolve the problem. 
		setTimeout("ResetNotification()", 500);
		//ResetNotification();
	}

}

var color_state=0;
var call_notification_timer=0;

function FlashCallNotification()
{
	//getObj('CallInformation').style.color = (color_state) ? '#cf0':'#cfc';
	//color_state = 1 - color_state;
}

function CallRequiresDisplayUpdate(oNewObj, oOldObj)
{
	return (CreateSingleRowHTML('CL', oNewObj) == CreateSingleRowHTML('CL', oOldObj));
}

var CALLFLAGS_OPERATION_SUPPORTED_ANSWER               = new Number(0x00000001);
var CALLFLAGS_OPERATION_SUPPORTED_DROPCALL             = new Number(0x00000002);
var CALLFLAGS_OPERATION_SUPPORTED_DROPCONNECTION       = new Number(0x00000004);
var CALLFLAGS_OPERATION_SUPPORTED_TRANSFER             = new Number(0x00000008);
var CALLFLAGS_OPERATION_SUPPORTED_HOLD                 = new Number(0x00000010);
var CALLFLAGS_OPERATION_SUPPORTED_RECORD               = new Number(0x00000020);
var CALLFLAGS_OPERATION_SUPPORTED_GROUPLISTEN          = new Number(0x00000040);
var CALLFLAGS_OPERATION_SUPPORTED_MUTE                 = new Number(0x00000080);
var CALLFLAGS_OPERATION_SUPPORTED_LEAVESTATIONMESSAGE  = new Number(0x00000100);
var CALLFLAGS_OPERATION_SUPPORTED_LEAVEVOICEMAIL       = new Number(0x00000200);

function ConfigureCallListButtons()
{

	var aSelectedRows, xpath='';
	
	if (oCallListNode.hasChildNodes())
	{
	    aSelectedRows = GetHighlightedRows(table['CL'].body);
		if (aSelectedRows.length == 1)
		{
			var call = oCallListNode.selectSingleNode('.//*[CallID="'+GetHighlightedCallID()+'"]');

			if (call)
			{
				var device_id = call.selectSingleNode('NodeID').text+':'+call.selectSingleNode('Extension').text;
				var oDevice = oDevNode.selectSingleNode('DEVICE[Extension="'+call.selectSingleNode('Extension').text+'"]');
				xpath +='(';

				// AnsweringInternalName>RecordACall</AnsweringInternalName> 
				// var b_CALL_WE_OWN = (call.selectSingleNode('UserID').text == oActNode.selectSingleNode('.//UniqueID]').text);
				
				var b_CONFERENCE_WE_DONT_OWN 			= (call.nodeName=='CONFERENCE_CALL' && (device_id != call.selectSingleNode('ControllingDeviceID').text));
				var b_MEMBER_OF_CONFERENCE 				= (call.selectSingleNode('ancestor(CONFERENCE_CALL)'));
				var b_MEMBER_OF_CONFERENCE_WE_DONT_OWN 	= (call.selectSingleNode('ancestor(CONFERENCE_CALL)/ControllingDeviceID') && (device_id != call.selectSingleNode('ancestor(CONFERENCE_CALL)/ControllingDeviceID').text));
				var b_RECORD_A_CALL						= (call.nodeName!='CONFERENCE_CALL' && call.selectSingleNode('AnsweringInternalName').text=='RecordACall')

				if (CallOperationEnabled(call, CALLFLAGS_OPERATION_SUPPORTED_ANSWER)
					&& DeviceSupportsFeatureCode(oDevice, 'ANSWER')
					&& !b_RECORD_A_CALL)
					xpath = addOperToXpath(xpath, 'ANSWER');

				if(ValidRootCallsSelected(aSelectedRows))
				{
					//Make sure WCRS is available and the user is permitted to launch WebInvite
					if (IsWebInviteFlagSet() && IsWebInviteServiceAvailable() && is_WCRSDisplayed != 0)
					{
					    //if its a conference we blindly give the colaborate button/feature
						if(oSys.selectSingleNode("R/CALL_LIST/CONFERENCE_CALL"))
							xpath = addOperToXpath(xpath, 'COLLABORATE');
						else
						{
						    //if its a single call, thats when we check, if the otherparty on the call can be invited or not
							var ret_vals = ParseDelimitedList(call.selectSingleNode('OtherPartyLinkedTo').text);
							if(ret_vals[1])
							{
								// Make sure that the call's destination is an account and not a device
								if(ret_vals[0] == "A")
								{
									//Now check if the Destination user is logged into either web or tray client, or if the user has email address
									if(CheckIfWebInviteCanBeSent(ret_vals[1]))
										xpath = addOperToXpath(xpath, 'COLLABORATE');
								}
    								// IF an email address exists, we can send an email invite, therefore display the webinvite button
	    							// probably the account is a simple contact with AN Inter-Tel device. In this case check for an email address.
								else if(call.selectSingleNode('OtherPartyContactUniqueID').text != "")
    								{
	    							    var contactID = call.selectSingleNode('OtherPartyContactUniqueID').text;
		    						    //get the simplecontact from the Personal Contacts
			    					    var oObj = oABNode.selectSingleNode('CONTACT[UniqueID="'+contactID+'"]');
				    				    //check if the contact has atleast 1 email address. IF so show the collaborate button
								    if(oObj)//check if the contact exists in the addressbook or not.
								    {	  
							    		    if(parseInt(oObj.selectSingleNode('Emails/LIST/NumberOfObjects').text)>=1)
								    	    	xpath = addOperToXpath(xpath, 'COLLABORATE');
								    }
							   	}
							}
                           				// make sure we atleast some otherpartylinked to information. If we absolutely have no info here, we cannot send an webinvite, therefore no point in showing the feature to the user
							else if(ret_vals[0])
							{
								// If the account has only accounts Unique ID as the linked Party
								//Now check if the Destination user is logged into either web or tray client, or if the user has email address
								if(CheckIfWebInviteCanBeSent(ret_vals[0]))
									xpath = addOperToXpath(xpath, 'COLLABORATE');
							}
							// IF an email address exists, we can send an email invite, therefore display the webinvite button
							// probably the account is a simple contact with NO Inter-Tel device. In this case check for an email address.
							else if(call.selectSingleNode('OtherPartyContactUniqueID').text != "")
							{
							    var contactID = call.selectSingleNode('OtherPartyContactUniqueID').text;
							    //get the simplecontact from the Personal Contacts
							    var oObj = oABNode.selectSingleNode('CONTACT[UniqueID="'+contactID+'"]');
							    //check if the contact has atleast 1 email address. IF so show the collaborate button
							    if(oObj)//check if the contact exists in the addressbook or not.
							    {	  
								    if(parseInt(oObj.selectSingleNode('Emails/LIST/NumberOfObjects').text)>=1)
							    		xpath = addOperToXpath(xpath, 'COLLABORATE');
							    }
							}
						}
					}
				}

				if (CallOperationEnabled(call, CALLFLAGS_OPERATION_SUPPORTED_DROPCALL)
					&& !b_MEMBER_OF_CONFERENCE_WE_DONT_OWN)
					xpath = addOperToXpath(xpath, 'DROP');
					
/*				if (CallOperationEnabled(call, CALLFLAGS_OPERATION_SUPPORTED_DROPCONNECTION) && (!b_CALL_WE_OWN || (b_CALL_WE_OWN && b_MEMBER_OF_CONFERENCE))) //!CallIsOnMyMultiLineDevice(call) || 
					xpath = addOperToXpath(xpath, 'DROPCONNECTION');//'@oper="DROPCONNECTION"';*/
				
				if (CallOperationEnabled(call, CALLFLAGS_OPERATION_SUPPORTED_TRANSFER)
					&& DeviceSupportsFeatureCode(oDevice, 'TRANSFER OAI')
					&& !b_CONFERENCE_WE_DONT_OWN
					&& !b_MEMBER_OF_CONFERENCE
					&& !b_RECORD_A_CALL)
					xpath = addOperToXpath(xpath, 'TRANSFER');
				
				if (CallOperationEnabled(call, CALLFLAGS_OPERATION_SUPPORTED_HOLD)
					&& DeviceSupportsFeatureCode(oDevice, 'INDIVIDUAL HOLD')
					&& !b_MEMBER_OF_CONFERENCE
					&& !b_RECORD_A_CALL)
					xpath = addOperToXpath(xpath, 'HOLD');
				
				if (CallOperationEnabled(call, CALLFLAGS_OPERATION_SUPPORTED_RECORD)
					&& DeviceSupportsFeatureCode(oDevice, 'RECORD-A-CALL')
					&& !b_MEMBER_OF_CONFERENCE
					&& !b_MEMBER_OF_CONFERENCE_WE_DONT_OWN
					&& !b_RECORD_A_CALL)
					xpath = (DeviceFlagActive(call.selectSingleNode('Extension').text, DEVICE_FEATURESTATUS_RECORD_A_CALL)) ? addOperToXpath(xpath, 'STOP_RECORD') : addOperToXpath(xpath, 'RECORD');
				
				if (CallOperationEnabled(call, CALLFLAGS_OPERATION_SUPPORTED_GROUPLISTEN)
					&& DeviceSupportsFeatureCode(oDevice, 'GRP LISTN ON/OFF')
					&& !b_MEMBER_OF_CONFERENCE
					&& !b_MEMBER_OF_CONFERENCE_WE_DONT_OWN
					&& !b_RECORD_A_CALL)
					xpath = addOperToXpath(xpath, 'GROUPLISTEN');
				
				if (CallOperationEnabled(call, CALLFLAGS_OPERATION_SUPPORTED_MUTE) 			
					&& DeviceSupportsFeatureCode(oDevice, 'MICROPHONE MUTE')
					&& !b_MEMBER_OF_CONFERENCE
					&& !b_RECORD_A_CALL)
					xpath = addOperToXpath(xpath, 'MUTE');
				
				if (CallOperationEnabled(call, CALLFLAGS_OPERATION_SUPPORTED_LEAVESTATIONMESSAGE)
					&& DeviceSupportsFeatureCode(oDevice, 'MESSAGE OAI')
					&& !b_MEMBER_OF_CONFERENCE_WE_DONT_OWN
					&& !b_RECORD_A_CALL)
					xpath = addOperToXpath(xpath, 'LEAVESTATIONMESSAGE');
				
				if (CallOperationEnabled(call, CALLFLAGS_OPERATION_SUPPORTED_LEAVEVOICEMAIL)
					&& DeviceSupportsFeatureCode(oDevice, 'MESSAGE OAI')
					&& !b_MEMBER_OF_CONFERENCE_WE_DONT_OWN
					&& !b_RECORD_A_CALL)
					xpath = addOperToXpath(xpath, 'LEAVEVOICEMAIL');
				
				xpath = (xpath == '(') ? '' : (xpath +')');
			}
		}
		

		// ValidRootCallsSelected will return true if no rows are selected or only root calls are selected
		else if (oCallListNode.childNodes.length > 1 && ValidRootCallsSelected(aSelectedRows))
			xpath = '(@oper="CONFERENCE")';
	}
	if (xpath)
		SetButtons('CL', xpath);
	else
		getObj('CL').children['buttons'].innerHTML='';
		
	// update type ahead results to add or clear the transfer icon as calls enter and leave the call list
	//if (table['TA'] && oSearchNode.selectSingleNode('TA').hasChildNodes())
	//{
		//alert("This case has to be handled - 2");
		//table['TA'].refresh();
	//}
		
	function addOperToXpath(path, operation)
	{
		var str= (path.length>1) ? ' or ' : '';
		str += '@oper="{0}"';
		return path + Insert(operation, str);
	}
}

function CheckIfWebInviteCanBeSent(param)
{
	var request_account = GetTemplate('ACCOUNT');
	request_account.selectSingleNode('.//UniqueID').text = param;
	var oInvite_Account = CallControlMethod('GetObjectSynch', request_account);
	user_status = parseInt(oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/AccountStatus/ACC_STATUS/Status').text);
	return (((user_status & LOGGEDIN_TRAYCLIENT)>0) || ((user_status & LOGGEDIN_WEBCLIENT)>0) || (oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/Emails/LIST/child0/STR/String')))	
}

function CallOperationEnabled(call, flag)
{
	return (flag  & parseFloat(call.selectSingleNode('Flags').text));
}

function CallIsOnMyMultiLineDevice(call)
{
	var b_MULTI_LINE_DEVICE = false;
	if (call.nodeName != 'CONFERENCE_CALL')
	{
		var device = oDevNode.selectSingleNode('DEVICE[OwnerAccount="'+oActNode.selectSingleNode('.//UniqueID').text+'" and Extension="'+ call.selectSingleNode('Extension').text +'"]');
		if (device)
		{
			var device_type = device.selectSingleNode('DeviceType').text;
			b_MULTI_LINE_DEVICE = (device_type != '1' || device_type != '18');
		}
	}
	return b_MULTI_LINE_DEVICE;
}

function ValidRootCallsSelected(aSelectedRows)
{
	var i=0;
	
	if (!aSelectedRows.length)
		aSelectedRows = table['CL'].body.children;

	// make sure no conference constituants or calls on different devices are conferenced
	var initial_device_id = aSelectedRows[0].EndpointID;
	while (aSelectedRows[i])
	{
		if (aSelectedRows[i].call_type=='conference_member' || 
			aSelectedRows[i].EndpointID != initial_device_id)
			return false;
		i++;
	}

	return true;
}

function ConferenceDragAndDrop(oRow)
{
	if (oRow && dragObj && oRow.type=='CL' && dragObj.type=='CL')
	{
		if (oRow.UniqueID != dragObj.UniqueID)
		{
			var del_call_ids = DelimitList(new Array(BuildDelimitedEndpointString(oRow.UniqueID), BuildDelimitedEndpointString(dragObj.UniqueID)));
			CallControlMethod('ConferenceCalls', del_call_ids);
		}
	}
}

function ConferenceCalls()
{
	var cur_rows=new Array, total_calls=0, i=0;
	var selected_rows = GetHighlightedRows(table['CL'].body), total_rows = table['CL'].body.children;
	
	// highlighted rows exist
	if (selected_rows.length)
		cur_rows = selected_rows;
	// conference everything
	else if (Confirm('CLCF'))
		cur_rows = total_rows;
		
	if (cur_rows)
	{
		var aIds = new Array, del_ids, j=0;
		while (cur_rows[j])
			aIds[aIds.length] = BuildDelimitedEndpointString(cur_rows[j++].UniqueID);
		del_ids = DelimitList(aIds);
		if (del_ids.length > cur_rows.length)
			CallControlMethod('ConferenceCalls', del_ids);
	}
}

function HighlightCallRow(oRow)
{
	// if a proper object doesn't exist or the target row
	// contains the dragged icon, don't do anything
	if (!dragObj || !dragObj.type || oRow.contains(dragObj))
		return;
		
	switch (window.event.type)
	{
		case 'dragenter':
			oRow.style.backgroundColor='#ff9';
			break;
			
		case 'dragleave':
			oRow.style.backgroundColor = oRow.prevColor;
			break;	
	}
}

function MuteCall()
{
	ExecuteFeatureCodeOnCall('MICROPHONE MUTE');
}

function GroupListen()
{
	ExecuteFeatureCodeOnCall('GRP LISTN ON/OFF');
}

function RecordACall()
{
	ExecuteFeatureCodeOnCall('RECORD-A-CALL');
}

function AddNumberToContact(type, id)
{
	var i=0, k=0;
	var id_path, num_path, contact_path='CONTACT[UniqueID="{0}"]';
	switch (type)
	{
		case 'CG':
			id_path 	= 'CALL_LOGS/CALLLOG[UniqueID="{0}"]/ContactUniqueID';
			num_path	= 'CALL_LOGS/CALLLOG[UniqueID="{0}"]/CallerIDNumber';
			break;
			
		case 'CL':
			var oCall = oCallListNode.selectSingleNode('*[CallID="'+id+'"]');
			var oStep = oStepsNode.selectSingleNode('STEP[UniqueID="'+oCall.selectSingleNode('ActiveStepID').text+'"]');
			// do not show if we originated call
			if (oCall.getAttribute('flow')=='out' || oCall.getAttribute('prompted')=='true' || oCall.selectSingleNode('ActiveRuleID').text=='-1' || (oStep && oStep.selectSingleNode('StepType').text==_STEPTYPE_PLAY_GREETING))
				return;

			id_path 	= 'CALL_LIST/*[CallID="{0}"]/OtherPartyContactUniqueID';
			num_path 	= 'CALL_LIST/*[CallID="{0}"]/'+GetXMLNodeNameForOtherPartyNumber(id);
			break;
	}
	if (id)
	{
		var unique_id = oRoot.selectSingleNode(Insert(id, id_path)).text;
		var new_number = oRoot.selectSingleNode(Insert(id, num_path)).text;
		if (unique_id)
		{
			var ab_obj = oABNode.selectSingleNode(Insert(unique_id, contact_path));
			if (ab_obj)
			{
				var name = ab_obj.selectSingleNode('FirstName').text +' '+ ab_obj.selectSingleNode('LastName').text;
				if (name.length == 1)
					name = ab_obj.selectSingleNode('Company').text;
				if (!PhoneNumberExistsInContact(ab_obj, new_number))
				{
					var rows='<row><select size="1" id="number_select">{0}</select></row>', options='', i=0;
					var nums = oRoot.selectNodes("CONTACT_FIELDS/FIELD[@locType and @type='TYPE_STRING_PHONE']");
					while(nums[k])
					{
						var option='<option value="{0}">{1} {2}</option>';
						var inserts = new Array(nums[k].getAttribute('locType'), nums[k].text, FormatPhoneNumber(ab_obj.selectSingleNode(nums[k].getAttribute('name')).text));
						options += InsertMultiple(inserts, option);
						k++;
					}
					rows = Insert(options, rows);
					if (type=='CL')
					{
						rows+='<row><input type="checkbox">'+text('DLG/NO_SHOW_PROMPT')+'</input></row>';
						oCall.setAttribute('prompted', 'true');
					}
					
					var ret_vals = ParseDelimitedList(Dialog(InsertMultiple(new Array(name, FormatPhoneNumber(RemoveNodePrefix(new_number))), text('DLG/AB/NUM_IMPT')), 1, rows, new Array(new Array('focus', 'number_select'))));
					if (eval(ret_vals[0]) && ret_vals[1])
					{
						var old_obj = ab_obj.cloneNode(true);
						ab_obj.selectSingleNode(oRoot.selectSingleNode(Insert(ret_vals[1], 'CONTACT_FIELDS/FIELD[@locType="{0}"]')).getAttribute('name')).text = RemoveNodePrefix(new_number);
						CallControlMethod('EditXMLObject', old_obj, ab_obj);
						if (type=='CG')
							UpdateSingleTableRow(type, oRoot.selectSingleNode(Insert(id, id_path).replace('/ContactUniqueID','')));
						else
							UpdateSingleTableRow('AB', ab_obj);
					}
					
					if (ret_vals[3] && eval(ret_vals[3]))
						SetAccountFlag('PromptToAddIdentifiedCaller', false);
						
					
				}
				else if (type=='CG')
					Dialog(InsertMultiple(new Array(FormatPhoneNumber(RemoveNodePrefix(new_number)), name), text('DLG/AB/NO_IMPT')), 0);
			}
		}
	}
}

function PhoneNumberExistsInContact(obj, new_number)
{
	var search_number = StripPhoneNumber(RemoveNodePrefix(new_number));
	return (obj && obj.selectSingleNode(Insert(search_number, '*[.="{0}"]'))) ? true : false;
}

// ****************************************************
// ******************  PASSPORTS  *********************
// ****************************************************

var FLAGS_MARGARITA_IS_LICENSED = new Number(0x00000001);
//The variable b_MARGARITA_LICENSED was originally initialized to "true" untill version UC 3.0. 
// In version 4.0 its initialization has been changed to "false" because of the decision to hide 
// all passport features.
var b_MARGARITA_LICENSED = false;

function HidePassportIfMargaritaNotLicensed()
{
	var flags = parseFloat(oRoot.selectSingleNode('LICENSE_STATUS/Flags').text);
	if (!flags & FLAGS_MARGARITA_IS_LICENSED && !b_DEBUG_MODE)
	{
		var oPPdiv = getObj('PP');
		if (oPPdiv)
			oPPdiv.outerHTML='';
		var oPPlink = getObj('vl_PP');
		if (oPPlink)
			oPPlink.outerHTML='';
		b_MARGARITA_LICENSED = false;
		table['CS'].refresh();
	}
}

function UpdatePassport()
{
	var oCurNode = (bIsWebClient) ? oPassNode : xData.documentElement;
	var oIdInput = getObj('pp_passport_id');
	var oPasswordInput = document.getElementById('pp_password');
	var oAutoLoginCheckbox = document.getElementById('pp_auto_login');
	var oPassport = oCurNode.selectSingleNode('PASSPORT[0]');

	if (oPassport)
	{
		if (IsValid(oIdInput))
		{
			if (IsValid(oPasswordInput))
			{
				oOldPassport = oPassport.cloneNode(true);
				oPassport.selectSingleNode('ID').text = oIdInput.value;
				oPassport.selectSingleNode('AutoLogin').text = oAutoLoginCheckbox.checked+'';
				
				// check if password update is necessary
				var password_value = oPasswordInput.value;
				var sNewEcryptPass = CallControlMethod('EncryptString', password_value);
				
				var re = new RegExp('[^\*]+', 'g');
				var b_non_star_characters = re.test(password_value);
				
				if (b_non_star_characters && sNewEcryptPass != oPassport.selectSingleNode('Password').text)
					oPassport.selectSingleNode('Password').text = sNewEcryptPass;
				
				CallControlMethod('EditXMLObject', oOldPassport, oPassport.cloneNode(true));
			}
			else
			{
				Dialog(text('DLG/PP/VAL_PASS'),0);
				SetFocus(oPasswordInput.id);
			}
		}
		else
		{
			if (Confirm('PP'))
			{
				oPassNode.removeChild(oPassport);
				CallControlMethod('DeleteXMLObject', oPassport);
				BuildDiv('PP', oPassNode);
			}
		}
	}
	else
	{
		if (IsValid(oIdInput) && IsValid(oPasswordInput))
		{
			oPassport = GetTemplate('Passport');
			oPassport.selectSingleNode('Owner').text 		= oActNode.selectSingleNode('.//UniqueID').text;
			oPassport.selectSingleNode('TenantGroup').text	= oActNode.selectSingleNode('.//TenantGroup').text;
			oPassport.selectSingleNode('ID').text			= oIdInput.value;
			oPassport.selectSingleNode('AutoLogin').text	= oAutoLoginCheckbox.checked+'';
			oPassport.selectSingleNode('Password').text		= CallControlMethod('EncryptString',oPasswordInput.value);
			oPassNode.appendChild(oPassport);
			CallControlMethod('AddXMLObject', oPassport);
		}
		else
		{
			Dialog(text('DLG/PP/VAL_INFO'),0);
			(IsValid(oIdInput)) ? SetFocus(oPasswordInput.id) : SetFocus(oIdInput.id);
		}
	}
	SetPassportValues();
}

function SetPassportValues()
{
	var oPassport = oPassNode.firstChild
	var oPassword = document.getElementById('pp_password');
	if (oPassport)
	{
		document.getElementById('pp_passport_id').value = oPassport.selectSingleNode('ID').text;
		oPassword.value = CallControlMethod('DecryptString', oPassport.selectSingleNode('Password').text);
		oPassword.encrpytedValue = oPassport.selectSingleNode('Password').text;
		oPassword.decrpytedValue = oPassword.value;
		document.getElementById('pp_auto_login').checked = boolVal(oPassport.selectSingleNode('AutoLogin'));
	}
}

function HandlePassportKeydown()
{
	//var oEl = window.event.srcElement;
	if (window.event.keyCode==13)
		UpdatePassport();
	return true;
}

/*************************************************************************************
********************************Collaborate functions********************************
*************************************************************************************/

var host = "NULL";
var host_email = '';
var Invite_uID = -1;
var uniqueIDs ;
var LOGGEDIN_TRAYCLIENT  = new Number(0x00004);
var LOGGEDIN_WEBCLIENT  = new Number(0x00001);
var Conference_Flag = 0;
var WebDemo_Window;

////////////////////////////////////////////////////////////////////////////////////////////
//WCRS specific functions here.
////////////////////////////////////////////////////////////////////////////////////////////

function appActive()
//******************************************************************************************
//Checks for active Collaboration Client session
//******************************************************************************************
{
	var activeSession;
	try{activeSession = (top.Utility.tryAppControl("PING") == 0);}			//session active
	catch(CError){activeSession = false;}
	return activeSession;
}

function SafeToJoin(){
//******************************************************************************************
//Checks for active WC or RS sessions
//******************************************************************************************
	var wdNotActive=false;
	var wiNotActive=false;
	var bSafe =true;
		
	try{wdActive = top.hWnd.Connection.document.Manager.isActive();}
		catch(CError){wdNotActive = true;}

	try{bTest = top.hWnd.Controls.Connection.document.Manager.isActive();}
		catch(CError){wiNotActive = true;}
		
	if ((appActive()) || (!wdNotActive) || (!wiNotActive)){
		bSafe=false;
	}
	return (bSafe);
}

function SetAEInfo(szMode, szID1, szID2, szRetPage){
//******************************************************************************************
//Sets cookies for Add/Edit functions
//******************************************************************************************
	var aParams = new Array("Mode", "ID1", "ID2", "RP");
	var aValues = new Array(szMode, szID1, szID2, szRetPage);
	SetCookie("AEINFO", aParams, aValues);
} //end function

function SetCookie(szCName, aParams, aValues){
//******************************************************************************************
//Sets basic user cookie information
//******************************************************************************************
	var szTemp = "";
	var nCount;
	//generate the parameter value pairs   
	for (nCount=0;nCount<aParams.length;nCount++){
		szTemp += aParams[nCount] + "=" + escape(aValues[nCount]) + "&";
	}
	//build the actual cookie string
	document.cookie = szCName + "=" + szTemp + "; path=/;";
} //end function

////////////////////////////////////////////////////////////////////////////////////////////
//End WCRS Specific Functions
////////////////////////////////////////////////////////////////////////////////////////////


function onConf_Collaborate()
{
	Conference_Flag = 1;
	OnCollaborate(-1);
}

function OnCollaborate(uID)
{
	var szErrorMessage = "You are in an active session.  <line_break/><line_break/>To exit Recorded Meetings or Document Manager, please click on the 'Office' button located on the Collaboration tab.  <line_break/><line_break/>If you have launched a Web Conference or Remote Support session, exit that session first.";
	//NOTE:   This error message matches the error message used in wcrs_buttons.asp
//	host = GetDisplayName();					//ORIGINAL CODE-this returns User First and Last name - NOT USERNAME!
	tmpRegValues = GetRegistryValues();				//get the username from the registry.  Returns array:[0]=username [1]=password [2]=autologinpreference
	if(tmpRegValues[0])									
		host = tmpRegValues[0];
	else
		host = "Unknown";					//if usernamen not found, 

	host_email = GetEmailAddress();
	uniqueIDs = new Array;
	if (uID != -1)
	{
		//  User select single account from the drop down menu.
		uniqueIDs = GetRowByUniqueID(table['AB'].body,uID);
	}
	else
	{
		//  User select multiple accounts from the Personal Contacts.
		uniqueIDs = GetHighlightedRows(table['AB'].body);
	}

	var Server_IP_Address = oConfig.selectSingleNode('CONFIG/SERVER').text;
//	popup("/jscriptapi.asp?mode=startmeeting&uid="+host,"host");
	SetAEInfo('Add', '', '', '');
	//SafeToJoin checks Web CLient, appActive checks Collaboration Client
	if(SafeToJoin() && (!appActive()) ){		
		ToggleLink(this, "CB");
		top.Display.location= "/WCRS$/jscriptapi_legacy.asp?mode=startmeeting&uid="+host+"&email="+host_email,"host";
	}else{
		Dialog(szErrorMessage,14);											//call UC Dialog function for popup
		try{
			top.hWnd.focus();													//set focus to WCRS control panel
		}catch(e){}
    }		
}

function popup(url, name, szOptions)
{

   if(!szOptions){
	xMax = screen.width; 
	xOffset = xMax - 272;
	szOptions = "location=0,menubar=0,resizable=0,height=244,width=262,";
	szOptions += "screenX=" + xOffset + ",screenY=0,top=0,left=" + xOffset;
   }

//	top.hWnd = window.open(url,name,szOptions);

	var szMsg_WebConfWindowOpen1 = "You already have a Web Conference window open. You can not have multiple Web Conference windows open at one time. If you want to continue with your current session please click NO. If you want to join the new session please close your active Web Conference window first and then click YES.";
	var szMsg_WebConfWindowOpen2 = "You can not have multiple Web Conference windows open at one time.";

	if(!SafeToJoin() || (appActive()) ){					//If WCRS session is running, let user know.
		var i = 0;
		do{	
			if(eval(ParseDelimitedList(Dialog(szMsg_WebConfWindowOpen1,15))[0])){		//if user clicks “YES” = [0]
				if(!SafeToJoin() || (appActive()) ){
					Dialog(szMsg_WebConfWindowOpen2, 14);		//reprompt user to close window, and loop again.
					i = 0;
				}else{
					i = 1;
					ToggleLink(this, "CB");
					parent.document.getElementById("Display").src=url;
				}
			}else{
				i = 1;
			}
		}while(i == 0)
	}else{
		ToggleLink(this, "CB");
		parent.document.getElementById("Display").src=url;
	}




//   xMax = screen.width; xOffset = xMax - 272;
//   szOptions = "location=0,menubar=0,resizable=0,height=244,width=262,";
//   szOptions += "screenX=" + xOffset + ",screenY=0,top=0,left=" + xOffset;

/*   if(!WebDemo_Window)
   {	WebDemo_Window = window.open(url,name,szOptions);}
   else if(WebDemo_Window.closed)
   {	WebDemo_Window = window.open(url,name,szOptions);}
   else 
   {
    var i = 0;
    do
    {	
	if(eval(ParseDelimitedList(Dialog("You already have a Web Conference window open. You can not have multiple Web Conference windows open at one time. ¶If you want to continue with your current session please click NO. ¶If you want to join the new session please close your active Web Conference window first and then click YES.",15))[0]))
	{
		if(WebDemo_Window.closed) 
		{
			WebDemo_Window = window.open(url,name,szOptions);
			i = 1;
		}
		else
		{
			alert("You can not have multiple Web Conference windows open at one time.");
			i = 0;
		}
	
	}
	else
	{
		i = 1;
	}
     }while(i == 0)
   }*/
} //end function popup

function replaceString(str1, str2, str3) 
{ // Replaces str1 with str2 inside str3

	for (var i = 0; i < str3.length; i++) {
		if (str3.substring(i, i + str1.length) == str1) {
			str3 = str3.substring(0, i) + str2 + str3.substring(i + str1.length, str3.length);
		}
	}
	return str3;
}

function getCookie(name)
{	//Server Name cookie created in JScriptAPI.asp in API_Login function as ("LoginInfo")("ServerName").

	var ca = document.cookie.split(';');
	var nameEQ = name + "=";
	for(var i=0; i < ca.length; i++) 
	{
		var c = ca[i];
		while (c.charAt(0)==' ') 
			c = c.substring(1, c.length); //clear spaces
		if (c.indexOf(nameEQ) == 0) 
			return c.substring(nameEQ.length, c.length);
	}
	return null;
}

function Collaborate(session) 
{
	if (session == "-1")
		alert("Session could not be created!");      
	else if (session == "-2")
		alert("Failed test browser!");      
	else if (session == "-3")
		alert("ConnectionPoint could not be reached!");
	var URL,FullName;

	// since we need the host name to be username when creating the account and 
	//when sending an invite to others, we want to use the first and last names, 
	//we are reassigning the "host" variable with the returned value of getdisplayname()

	host = GetDisplayName(); 
	var user_status;
	var email = new Array;
	var Email_counter = 0;
	var space = ' ';
	var Server_IP_Address = oConfig.selectSingleNode('CONFIG/SERVER').text;	

	var WCRS_ServerName = getCookie("ServerName");			//servername stored in WCRS database, added to cookie during login
	var escaped_dot = "%2E";								//Javascript stores cookie using escaped characters - need to convert back to normal characters.
	var normal_dot = ".";

	// Get WCRS servername stored in cookie that was set from value in WCRS database during API_Login function.
	if(WCRS_ServerName)
		WCRS_ServerName = replaceString(escaped_dot, normal_dot , WCRS_ServerName);		
	else
		WCRS_ServerName = document.domain;	

	if(Conference_Flag == 0 )
	{
		//clicked on a collaborate button and the host is not on a call currently
		if(/*Invite_uID != -1 &&*/ session > 0)
		{
			var Invited = new Array;
			var UnInvited = new Array;
			var counter1 = 0;
			var counter2 = 0;
			var x = 0;
			var uniqueID;
//			alert("i am here - 1");
			while (uniqueIDs[x])
			{
	  		        uniqueID = uniqueIDs[x++].UniqueID;
//				alert(uniqueID);

				user_status = 0;
				if(oABNode.selectSingleNode('CONTACT[UniqueID="'+ uniqueID +'"]'))
				{
					var oDataObj = oABNode.selectSingleNode('CONTACT[UniqueID="'+ uniqueID +'"]');
					var link_param = oDataObj.selectSingleNode('LinkParameter').text;	
					var oStatus = oStatusListNode.selectSingleNode('ACC_STATUS[OwnerUniqueID="'+ link_param +'"]');
					if (oStatus)
						user_status = parseInt(oStatus.selectSingleNode('Status').text);		
				}
				else
				{
					var oinvite_node = oSearchNode.selectSingleNode('TA/CONTACT[UniqueID="'+ uniqueID +'"]');
					if(oinvite_node.selectSingleNode('LinkType').text != 'D')
					{
//						alert("i am here in search-get account info");
						var request_account = GetTemplate('ACCOUNT');
						request_account.selectSingleNode('.//UniqueID').text = uniqueID;
						var oDataObj = CallControlMethod('GetObjectSynch', request_account);
						oDataObj = oDataObj.selectSingleNode('ACCOUNT/ContactElements/CONTACT');
						user_status = parseInt(oDataObj.selectSingleNode('AccountStatus/ACC_STATUS/Status').text);
						var link_param = oDataObj.selectSingleNode('UniqueID').text;
					}
				}

				FullName = oDataObj.selectSingleNode('FirstName').text;
				if(FullName)
				{
					FullName += ' ' + oDataObj.selectSingleNode('LastName').text;	
				}
				else
				{
					FullName = oDataObj.selectSingleNode('LastName').text;	
				}
				if(!FullName)
				{
					FullName = oDataObj.selectSingleNode('MiddleName').text;				
				}
				if(!FullName)
				{
					FullName = "Unknown";				
				}

				var szHostMode = "enable";  //used for jscriptapi_legacy sendemail function.
				var URL1 = "/WCRS$/jscriptapi_legacy.asp?mode=joinmeeting&uid="+FullName+"&sid="+session;
//				var URL2 = WCRS_ServerName + "/WCRS$/jscriptapi_legacy.asp?mode=joinmeeting&emailink=true&uid="+FullName+"&sid="+session;	
				var URL2 = WCRS_ServerName + "/WCRS$/default.asp?sessid="+session+"&remotehandle="+FullName+"&UCMode=true";
				//Need to link to default.asp with UCMode parameter if invitee is logged into only Tray Client.
				//Default.asp will handle the Collaboration Client detection if it is installed, UCMode will strip out the frameset.
				//Can't use joinmeeting if invitee is in Tray only because joinmeeting needs wapplink utility functions to work.
				//We know that user is in tray only if this URL is used.

//				var URL3 = "/wcrs$/jscriptapi_legacy.asp?mode=sendemail&sid="+session;
				var URL3 = "/wcrs$/jscriptapi_legacy.asp?mode=sendemail&sid="+session + "&szHostMode=" + szHostMode;

				//switched order of test for WebClient and Tray Client - for WCRS.
				if((user_status & LOGGEDIN_WEBCLIENT)>0)
				{
					var param = 'if(eval(ParseDelimitedList(Dialog("'+host+space+'"+"'+text('DLG/INVITE')+'",15))[0])){popup("'+URL1+'","user");}';
					//alert(param);
					CallControlMethod('CreateClientToClientCommand',param,link_param ,0x001,'FALSE');
					if(FullName != "Unknown") 
						Invited[counter1++] = FullName;
					else 
						Invited[counter1++] = link_param;
				}
				else if ((user_status & LOGGEDIN_TRAYCLIENT)>0)
				{
					var param = 'OnWebInvite("'+host+'","'+URL2+'")';
					//alert(param);
					CallControlMethod('CreateClientToClientCommand',param,link_param ,0x004,'FALSE');					
					if(FullName != "Unknown") 
						Invited[counter1++] = FullName;
					else 
						Invited[counter1++] = link_param;					
				}
				else if (oDataObj.selectSingleNode('Emails/LIST/child0/STR/String'))
				{
					email[Email_counter] = oDataObj.selectSingleNode('Emails/LIST/child0/STR/String').text;
					//alert(email[Email_counter]);
					if(FullName != "Unknown")  
					{
						Invited[counter1++] = FullName;
						URL3 += "&to="+email[Email_counter];
//						var emailInvite = "Sending Email Invitation to " + FullName;
//						Dialog(emailInvite,14);     //Inform Host that email invitation is being sent to a user.
						popup(URL3,"user","");
					}
					else 
						Invited[counter1++] = link_param;
					Email_counter++;
				}
				else
				{
					if(FullName != "Unknown") 
					{
						UnInvited[counter2++] = FullName;
					}
					else 
					{
						UnInvited[counter2++] = link_param;				
					}
				}				
				
			} // while
			if(UnInvited[0])
			{
				message = "The following parties are not set up for Web Conference and could not be invited!\n";
				for(i=0;i<counter2;i++) 
					message += '\n'+'-'+space+ UnInvited[i];
				Dialog_Modeless(message,0);
			}			
		}
	}
	else
	{
//		alert("i am here - 2");
		var oCallList_uID,alert_param;
		if(oSys.selectSingleNode("R/CALL_LIST/CALL"))
		{
			var is_Account;
			//clicked on the collaborate button when on a single call
			oCallList_uID = oCallListNode.selectSingleNode('.//*[CallID="'+GetHighlightedCallID()+'"]');
			if(ParseDelimitedList(oCallList_uID.selectSingleNode('OtherPartyLinkedTo').text)[1])
			{
				is_Account = ParseDelimitedList(oCallList_uID.selectSingleNode('OtherPartyLinkedTo').text)[0];
				alert_param = ParseDelimitedList(oCallList_uID.selectSingleNode('OtherPartyLinkedTo').text)[1];
			}
			else
			{
				alert_param = ParseDelimitedList(oCallList_uID.selectSingleNode('OtherPartyLinkedTo').text)[0];
			}
//			alert(alert_param);
			
			if (is_Account == 'A')
			{
				var request_account = GetTemplate('ACCOUNT');
				request_account.selectSingleNode('.//UniqueID').text = alert_param;
				var oInvite_Account = CallControlMethod('GetObjectSynch', request_account);

				FullName = oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/FirstName').text;
				if(FullName)
				{
					FullName += ' ' + oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/LastName').text;	
				}
				else
				{
					FullName = oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/LastName').text;	
				}
				if(!FullName)
				{
					FullName = oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/MiddleName').text;				
				}
				if(!FullName)
				{
					FullName = "Unknown";				
				}

				var URL1 = "/WCRS$/jscriptapi_legacy.asp?mode=joinmeeting&uid="+FullName+"&sid="+session;
//				var URL2 = WCRS_ServerName + "/WCRS$/jscriptapi_legacy.asp?mode=joinmeeting&emailink=true&uid="+FullName+"&sid="+session;	
				var URL2 = WCRS_ServerName + "/WCRS$/default.asp?sessid="+session+"&remotehandle="+FullName+"&UCMode=true";
				var URL3 = "/wcrs$/jscriptapi_legacy.asp?mode=sendemail&sid="+session + "&szHostMode=" + szHostMode;

				user_status = parseInt(oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/AccountStatus/ACC_STATUS/Status').text);
	//			alert(user_status);

				//Switched order of test for WebClient and Tray Client - WCRS needs to test for Webclient first.
				//If user is logged into Web and Tray, we want to follow Web option.
				if((user_status & LOGGEDIN_WEBCLIENT)>0)
				{
					var param = 'if(eval(ParseDelimitedList(Dialog("'+host+space+'"+"'+text('DLG/INVITE')+'",15))[0])){popup("'+URL1+'","user");}';
	//				alert(param);
					CallControlMethod('CreateClientToClientCommand',param,alert_param ,0x001,'FALSE');
				}
				else if ((user_status & LOGGEDIN_TRAYCLIENT)>0)
				{
					var param = 'OnWebInvite("'+host+'","'+URL2+'")';
	//				alert(param);
					CallControlMethod('CreateClientToClientCommand',param,alert_param ,0x004,'FALSE');
				}
				else if(oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/Emails/LIST/child0/STR/String'))
				{
					email[Email_counter] = oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/Emails/LIST/child0/STR/String').text;
	//				alert(email);
	
					if(FullName != "Unknown")
					{ 
						URL3 += "&to="+email[Email_counter];
//						var emailInvite = "Sending Email Invitation to " + FullName;
//						Dialog(emailInvite,14);     //Inform Host that email invitation is being sent to a user.
						popup(URL3,"user","");
					}	
					Email_counter++;	
				}
				else if (oCallList_uID.selectSingleNode('OtherPartyContactUniqueID'))
				{			    	
					var calllistID = oCallList_uID.selectSingleNode('OtherPartyContactUniqueID').text;
					if(oABNode.selectSingleNode('CONTACT[UniqueID="'+ calllistID +'"]'))
					{
						var oemailNode = oABNode.selectSingleNode('CONTACT[UniqueID="'+ calllistID +'"]');
						var emaillistNode = oemailNode.selectSingleNode('Emails');
						var aEmails = emaillistNode.selectNodes('LIST/*/*/String[.!=""]');
						if (aEmails.item(0))
						{
							var email = aEmails.item(0).text;
							email[Email_counter] = email;
							Email_counter++;
						}
						else
						{
							var name = oemailNode.selectSingleNode('FirstName').text + space + oemailNode.selectSingleNode('LastName').text;
							if(name != '')
								UnInvited[counter2++] = name;
							else
								UnInvited[counter2++] = oCallList_uID.selectSingleNode('OtherPartyFirstName').text + space + oCallList_uID.selectSingleNode('OtherPartyLastName').text;
						}				
					}
					else
						UnInvited[counter2++] = oCallList_uID.selectSingleNode('OtherPartyFirstName').text + space + oCallList_uID.selectSingleNode('OtherPartyLastName').text;	    
				}			
			
			}
			else if (is_Account=='D')
			{
				var linkParameter = alert_param;
				if(oABNode.selectSingleNode('CONTACT[LinkParameter="'+ alert_param +'"]'))
				{
					var oemailNode = oABNode.selectSingleNode('CONTACT[LinkParameter="'+ linkParameter +'"]');
					var emaillistNode = oemailNode.selectSingleNode('Emails');
					var aEmails = emaillistNode.selectNodes('LIST/*/*/String[.!=""]');
					if (aEmails.item(0))
					{
						var email = aEmails.item(0).text;
						email[Email_counter] = email;
						Email_counter++;
					}
					else
					{
						var name = oemailNode.selectSingleNode('FirstName').text + space + oemailNode.selectSingleNode('LastName').text;
						if(name != '')
							UnInvited[counter2++] = name;
						else
							UnInvited[counter2++] = oCallList_uID.selectSingleNode('OtherPartyFirstName').text + space + oCallList_uID.selectSingleNode('OtherPartyLastName').text;
					}				
				}
				else
					UnInvited[counter2++] = oCallList_uID.selectSingleNode('OtherPartyFirstName').text + space + oCallList_uID.selectSingleNode('OtherPartyLastName').text;	    


				}			    
				else if (oCallList_uID.selectSingleNode('OtherPartyContactUniqueID'))
				{			    	
				var calllistID = oCallList_uID.selectSingleNode('OtherPartyContactUniqueID').text;
				if(oABNode.selectSingleNode('CONTACT[UniqueID="'+ calllistID +'"]'))
				{
					var oemailNode = oABNode.selectSingleNode('CONTACT[UniqueID="'+ calllistID +'"]');
					var emaillistNode = oemailNode.selectSingleNode('Emails');
					var aEmails = emaillistNode.selectNodes('LIST/*/*/String[.!=""]');
					if (aEmails.item(0))
					{
						var email = aEmails.item(0).text;
						email[Email_counter] = email;
						Email_counter++;
					}
					else
					{
						var name = oemailNode.selectSingleNode('FirstName').text + space + oemailNode.selectSingleNode('LastName').text;
						if(name != '')
							UnInvited[counter2++] = name;
						else
							UnInvited[counter2++] = oCallList_uID.selectSingleNode('OtherPartyFirstName').text + space + oCallList_uID.selectSingleNode('OtherPartyLastName').text;
					}				
				}
				else
					UnInvited[counter2++] = oCallList_uID.selectSingleNode('OtherPartyFirstName').text + space + oCallList_uID.selectSingleNode('OtherPartyLastName').text;	    
			}
			else
			{
				alert("The account is not set up for Web Conference and could not be invited!\n");
			}
		
		}
		else if(oSys.selectSingleNode("R/CALL_LIST/CONFERENCE_CALL"))
		{
			//clicked on the collaborate button and is currently in a conference call
			var Invited = new Array;
			var UnInvited = new Array;
			var Invite_xPath;
			var counter1 = 0;
			var counter2 = 0;
			var is_Account;
			var NumberOfConfCalls = parseInt(oSys.selectSingleNode('R/CALL_LIST/CONFERENCE_CALL/NumberOfCalls').text);
//			alert(NumberOfConfCalls);
			for(i=0;i<NumberOfConfCalls;i++)
			{
				Invite_xPath = 'R/CALL_LIST/CONFERENCE_CALL/CALL'+i+'/CALL';
//				alert(Invite_xPath);
				//initialize is_account to anything other than A and D. A-account, D-Device.
				is_Account = 'N';
				oCallList_uID = oSys.selectSingleNode(Invite_xPath);
				if(ParseDelimitedList(oCallList_uID.selectSingleNode('OtherPartyLinkedTo').text)[1])
				{
					is_Account = ParseDelimitedList(oCallList_uID.selectSingleNode('OtherPartyLinkedTo').text)[0];
					alert_param = ParseDelimitedList(oCallList_uID.selectSingleNode('OtherPartyLinkedTo').text)[1];
				}
				else
				{
					alert_param = ParseDelimitedList(oCallList_uID.selectSingleNode('OtherPartyLinkedTo').text)[0];
				}
//				alert(alert_param);

			   if(is_Account=='A')
			   {	// if the conference party is an account	
			
				var request_account = GetTemplate('ACCOUNT');
				request_account.selectSingleNode('.//UniqueID').text = alert_param;
				var oInvite_Account = CallControlMethod('GetObjectSynch', request_account);

				FullName = oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/FirstName').text;
				if(FullName)
				{
					FullName += ' ' + oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/LastName').text;	
				}
				else
				{
					FullName = oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/LastName').text;	
				}
				if(!FullName)
				{
					FullName = oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/MiddleName').text;				
				}
				if(!FullName)
				{
					FullName = "Unknown";				
				}

				var URL1 = "/WCRS$/jscriptapi_legacy.asp?mode=joinmeeting&uid="+FullName+"&sid="+session;
//				var URL2 = WCRS_ServerName + "/WCRS$/jscriptapi_legacy.asp?mode=joinmeeting&emailink=true&uid="+FullName+"&sid="+session;	
				var URL2 = WCRS_ServerName + "/WCRS$/default.asp?sessid="+session+"&remotehandle="+FullName+"&UCMode=true";
				var URL3 = "/wcrs$/jscriptapi_legacy.asp?mode=sendemail&sid="+session + "&szHostMode=" + szHostMode;

				user_status = parseInt(oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/AccountStatus/ACC_STATUS/Status').text);
//				alert(user_status);
	
				//Switched order of test for WebClient and Tray Client - WCRS needs to test for Webclient first.
				//If user is logged into Web and Tray, we want to follow Web option.
				if((user_status & LOGGEDIN_WEBCLIENT)>0)
				{
					var param = 'if(eval(ParseDelimitedList(Dialog("'+host+space+'"+"'+text('DLG/INVITE')+'",15))[0])){popup("'+URL1+'","user");}';
//					alert(param);
					CallControlMethod('CreateClientToClientCommand',param,alert_param ,0x001,'FALSE');
					if(FullName != "Unknown") Invited[counter1++] = FullName;
					else Invited[counter1++] = alert_param;
				}
				else if ((user_status & LOGGEDIN_TRAYCLIENT)>0)
				{
					var param = 'OnWebInvite("'+host+'","'+URL2+'")';
//					alert(param);
					CallControlMethod('CreateClientToClientCommand',param,alert_param ,0x004,'FALSE');
					if(FullName != "Unknown") Invited[counter1++] = FullName;
					else Invited[counter1++] = alert_param;
				}
				else if(oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/Emails/LIST/child0/STR/String'))
				{	
					email[Email_counter] = oInvite_Account.selectSingleNode('ACCOUNT/ContactElements/CONTACT/Emails/LIST/child0/STR/String').text;
//					alert(email[Email_counter]);
					if(FullName != "Unknown")
					{
						Invited[counter1++] = FullName;
						URL3 += "&to="+email[Email_counter];
//						var emailInvite = "Sending Email Invitation to " + FullName;
//						Dialog(emailInvite,14);     //Inform Host that email invitation is being sent to a user.
						popup(URL3,"user","");
					}
					else 
						Invited[counter1++] = alert_param;
					Email_counter++;
				}

				//the user does not have any email information associated and is also not logged into either of UC clients. add user to uninvited list
				else
				{
					if(FullName != "Unknown") UnInvited[counter2++] = FullName;
					else 
					{
						var not_Invited_Name = oCallList_uID.selectSingleNode('OtherPartyFirstName').text
						not_Invited_Name += space + oCallList_uID.selectSingleNode('OtherPartyLastName').text
						if(not_Invited_Name==space)
							UnInvited[counter2++] = alert_param;
						else
							UnInvited[counter2++] = not_Invited_Name;					
					}
				}
			    }

			    else if (is_Account=='D')
			    {
				var linkParameter = alert_param;
				if(oABNode.selectSingleNode('CONTACT[LinkParameter="'+ alert_param +'"]'))
				{// check if its a simple contact with a Inter-Tel device
					var oemailNode = oABNode.selectSingleNode('CONTACT[LinkParameter="'+ linkParameter +'"]');
					var emaillistNode = oemailNode.selectSingleNode('Emails');
					var aEmails = emaillistNode.selectNodes('LIST/*/*/String[.!=""]');
					if (aEmails.item(0))
					{
						var email = aEmails.item(0).text;
						email[Email_counter] = email;
						Email_counter++;
					}
					else
					{
						var name = oemailNode.selectSingleNode('FirstName').text + space + oemailNode.selectSingleNode('LastName').text;
						if(name != '')
							UnInvited[counter2++] = name;
						else
							UnInvited[counter2++] = oCallList_uID.selectSingleNode('OtherPartyFirstName').text + space + oCallList_uID.selectSingleNode('OtherPartyLastName').text;
					}				
				}
				else
					UnInvited[counter2++] = oCallList_uID.selectSingleNode('OtherPartyFirstName').text + space + oCallList_uID.selectSingleNode('OtherPartyLastName').text;	    
			    	
			    	
			    }			    
			    else if (oCallList_uID.selectSingleNode('OtherPartyContactUniqueID'))
			    {	//check if its a simple contact with an email address		    	
				var calllistID = oCallList_uID.selectSingleNode('OtherPartyContactUniqueID').text;
				if(oABNode.selectSingleNode('CONTACT[UniqueID="'+ calllistID +'"]'))
				{
					var oemailNode = oABNode.selectSingleNode('CONTACT[UniqueID="'+ calllistID +'"]');
					var emaillistNode = oemailNode.selectSingleNode('Emails');
					var aEmails = emaillistNode.selectNodes('LIST/*/*/String[.!=""]');
					if (aEmails.item(0))
					{
						var email = aEmails.item(0).text;
						email[Email_counter] = email;
						Email_counter++;
					}
					else
					{
						var name = oemailNode.selectSingleNode('FirstName').text + space + oemailNode.selectSingleNode('LastName').text;
						if(name != '')
							UnInvited[counter2++] = name;
						else
							UnInvited[counter2++] = oCallList_uID.selectSingleNode('OtherPartyFirstName').text + space + oCallList_uID.selectSingleNode('OtherPartyLastName').text;
					}				
				}
				else
					UnInvited[counter2++] = oCallList_uID.selectSingleNode('OtherPartyFirstName').text + space + oCallList_uID.selectSingleNode('OtherPartyLastName').text;	    
			    }

			    //its a device and hence cannot be invited to the conference. add it to the list of uninvited.
			    else
			    { 
				var not_Invited_Name = oCallList_uID.selectSingleNode('OtherPartyFirstName').text
				not_Invited_Name += space + oCallList_uID.selectSingleNode('OtherPartyLastName').text
				if(not_Invited_Name==space)
					UnInvited[counter2++] = alert_param;
				else
					UnInvited[counter2++] = not_Invited_Name						
			    }		
			}
			//printout the results of invitation on to the screen
			//var message = "The following parties have been invited:\n";
			//for(i=0;i<counter1;i++) message += '\n'+'-'+space+ Invited[i];
			//alert(message);
			if(UnInvited[0])
			{
				message = "The following parties are not set up for Web Conference and could not be invited!\n";
				for(i=0;i<counter2;i++) message += '\n'+'-'+space+ UnInvited[i];
				Dialog_Modeless(message,0);
//				alert("12345");
			}
		}
	}
	Conference_Flag = 0;
//   alert(email);
//   return(email);
}

