
var sPreviousDiv;
// ****************************************************
// ******************  ADD CONTACT  *******************
// ****************************************************

var oXMLFormObj, _editStatus, b_ADDING_MULTIPLE_CONTACTS;

function AddContact()
{
	if (CheckStatus(_AB_ENABLED))
	{
		var sDiv = 'AB', date = new Date();
		Hide('AB');
		oXMLFormObj = GetTemplate('CONTACT');
		oXMLFormObj.selectSingleNode('TenantGroup').text = oActNode.selectSingleNode('.//TenantGroup').text;
		oXMLFormObj.selectSingleNode('Owner').text = oActNode.selectSingleNode('.//UniqueID').text;
		oXMLFormObj.selectSingleNode('UniqueID').text = date.getTime();
		oABNode.appendChild(oXMLFormObj);
		EditObject('AB', oXMLFormObj.selectSingleNode('UniqueID').text, 1);
	}
}

// ****************************************************
// ************  VIEW/EDIT ACCOUNT/CONTACTS  **********
// ****************************************************

function ViewObject(sType, sCurID)
{
	var oObj = oABNode.selectSingleNode('CONTACT[UniqueID="'+sCurID+'"]');
	oObj.setAttribute('readOnly', '1');
	BuildDiv('ED', oObj);
	oObj.removeAttribute('readOnly');
	SetAdvancedTab(oObj, 0);
//	getObj('ED').firstChild.firstChild.innerText = 'Detail View';
	Show('ED');
	sCurDiv='ED';
	if(sType == 'AB')
	{
		sPreviousDiv='CT';
		Hide("CT");
	}
	else
	{
//		BuildTable('DV');
//		BuildDiv('dv_feature_codes');
	}
}

function CloseObjectView()
{
	Hide('ED');
	sCurDiv = getObj('editObject').value;
	if(sCurDiv == 'AB')	
	{	Show("CT"); sCurDiv = 'CT'; }
	else
		Show(sCurDiv);
}

function CopyObject(type, sCurID)
{
	switch (type)
	{
		case 'AB':
			var oObj = oABNode.selectSingleNode('CONTACT[UniqueID="'+sCurID+'"]').cloneNode(true);
			if (oObj)
			{
				var date = new Date();
				oObj.selectSingleNode('DN').text='';
				oObj.selectSingleNode('UniqueID').text = date.getTime();
				oObj.selectSingleNode('LinkType').text='';
				oObj.selectSingleNode('LinkParameter').text='';
				oObj.selectSingleNode('WorkNumber1').text='';
				oObj.selectSingleNode('WorkNumber2').text='';
				oObj.selectSingleNode('WorkIPPhone').text='';
//				oObj.selectSingleNode('WorkMobileNumber').text='';
				oABNode.appendChild(oObj);
				CallControlMethod('AddXMLObject', oObj);
				UpdateAddressBookLists();
			}
			break;
	}
}

function EditObject(sType, sCurID, bIsNew)
{
	var oCurObj, cur_tab;
	if (!sType || sType.length>2)
		sType = getObj('editObject').value;
	if (!IsNum(sCurID))
		sCurID = getObj('editID').value;
	switch (sType)
	{
		case 'AB':

			if (!oXMLFormObj)
				oXMLFormObj = oABNode.selectSingleNode('CONTACT[UniqueID="'+sCurID+'"]');
			oCurObj = oXMLFormObj;
			Hide("tableAB");
			Hide("CT");
			break;
		
		case 'NA':
			break;
		
		case 'PI':
			oCurObj=oActNode;
			break;
	}
	oCurObj.setAttribute('readOnly', '0');
	BuildDiv('ED', oCurObj);
	oCurObj.removeAttribute('readOnly');
	getObj('editType').value = (bIsNew) ? 'add':'edit';
	SetAdvancedTab(oCurObj, 1);
	Show('ED');
	sCurDiv='ED';
	if(sType == 'AB')
	{
		sPreviousDiv='CT';
		Hide('CT');
	}
	else
	{
		//BuildTable('DV');
		//BuildDiv('dv_feature_codes');
		sPreviousDiv=sType;
		Hide(sType);
	}
	if (tab[sType])
	{
		cur_tab = tab[sType].curTab
		if (IsNum(cur_tab) && tab['ED'].head.children[cur_tab])
			tab['ED'].head.children[cur_tab].click();
	}
}



function SaveEdit()
{
	var myProfileTabIndex = 0;
	var edit_target = getObj('editObject').value;
	var edit_type = getObj('editType').value;
	var oObj = (edit_target=='AB') ? oXMLFormObj : oActNode;
	var oOldObj = oObj.cloneNode(true);
	var aChangedFormElements = GetChangedFormElementNames('edit'), i=0;
	var b_STEP_DESCRIPTION_ELEMENT = false;
	var b_CS_LOCATION_ELEMENT = false;

	while (aChangedFormElements[i])
	{
	
		var sXMLNodeName = aChangedFormElements[i].replace('edit', '');
		var sValue, XPath = './/'+sXMLNodeName;
		switch(aChangedFormElements[i])
		{	
			case 'editEmails':
				var oOptions = getObj('editEmails').options,  k=0, j=0;
				var oEmailsNode = oObj.selectSingleNode(XPath);
				var oStrings = oEmailsNode.selectNodes('LIST//String');
				
				// remove existing strings
				while (oStrings[k])
					oEmailsNode.selectSingleNode('LIST').removeChild(oStrings[k++].parentNode.parentNode);
					
				// reset number in case the select box is empty
				oEmailsNode.selectSingleNode('LIST/NumberOfObjects').text = '0';
				
				// add new nodes from options
				while (oOptions[j])
					AddChildNodeToListObject(oEmailsNode, oOptions[j++].value);

				sXMLNodeName = null;
				break;
			
			case 'editPrivate':
			case 'editUnlisted':
				sValue = (getObj(aChangedFormElements[i]).checked)?'true':'false';
				break;
				
			case 'editToolbarOnTop':
			//	ClientCookie(true, CLIENT_COOKIE_ToolbarOnTop, (getObj(aChangedFormElements[i]).checked)?'true':'false');
			//	sXMLNodeName=null;
				break;
				
			case 'editExpandUserButtons':
				ClientCookie(true, CLIENT_COOKIE_ExpandUserButtons, (getObj(aChangedFormElements[i]).checked)?'true':'false');
				sXMLNodeName=null;
				SetUserButtonPreference();
				break;
				
			case 'editSynchReminder':
				ClientCookie(true, CLIENT_COOKIE_SynchReminder, (getObj(aChangedFormElements[i]).checked)?'true':'false');
				sXMLNodeName=null;
				break;
				
			case 'editAutoSave':
//			case 'editRoutingEnabled':
			case 'editPositiveCallerID':
			case 'editUsingSharedDevice':
			case 'editIncludeAccountsInPhoneClientSearch':
			case 'editASRConfirmationPrompts':
			case 'editPhoneClientAutoLogon':
			case 'editPromptToAddIdentifiedCaller':
				XPath = 'Flags';
				sValue = ConfigureFlagsCheckboxes(true, parseFloat(oObj.selectSingleNode('Flags').text));
				break;
				
			case 'editTimeZone':
				var oSelect = getObj(aChangedFormElements[i]);
				var oTimeZoneObj = CallControlMethod('GetTimeZoneByName', oSelect.options[oSelect.selectedIndex].text);
				var oTimeZoneNode = oObj.selectSingleNode('TimeZone');
				oTimeZoneNode.replaceChild(oTimeZoneObj.firstChild, oTimeZoneNode.firstChild);
				sXMLNodeName=null;
				break;
			
			default:
				sValue = getObj(aChangedFormElements[i]).value;
		}
		if (sXMLNodeName)
		{
			// if the field being update is a phone number, the BuildDiv('PI') will choke when it attempts
			// to output a value with formatting characters - ()
			var oFieldNode = oRoot.selectSingleNode('CONTACT_FIELDS/FIELD[@name="'+sXMLNodeName+'"]');
			if (oFieldNode && oFieldNode.getAttribute('type')=='TYPE_STRING_PHONE')
				sValue = StripPhoneNumber(sValue);
				
			oObj.selectSingleNode(XPath).text = sValue;
			
			//if (sXMLNodeName=='editRoutingEnabled')
			//	getObj('rr_enabled_toggle').checked = GetAccountFlag('RoutingEnabled');
				
			// set the flag if any edited items may be referenced in rule so the rules table can be updated
			switch (edit_target)
			{
				case 'AB':
					if ((aChangedFormElements[i]=='editFirstName' || aChangedFormElements[i]=='editLastName' || aChangedFormElements[i]=='editCompany') &&
						 oStepsNode.selectSingleNode('STEP[StepType="'+_STEPTYPE_SEND_TO_CONTACT+'" and Destination="'+oObj.selectSingleNode('UniqueID').text+'"]'))
						b_STEP_DESCRIPTION_ELEMENT = true;
					break;
					
				case 'PI':
					if (oFieldNode.getAttribute('locType') && oStepsNode.selectSingleNode('STEP[StepType="'+_STEPTYPE_SEND_TO_LOCATION+'" and LocationType="'+ oFieldNode.getAttribute('locType') +'" and Destination=""]'))
						b_STEP_DESCRIPTION_ELEMENT = true;
					if (oFieldNode.getAttribute('locType') && oCompStatusNode.selectSingleNode('COMPOSITE_STATUS[LocationType="'+ oFieldNode.getAttribute('locType') +'"]'))
						b_CS_LOCATION_ELEMENT = true;
					break;
			}
		}
		i++;
	}

	//if (aChangedFormElements!='')
	if (aChangedFormElements.length)
	{

		if (edit_type=='add')
			CallControlMethod('AddXMLObject', oObj);
		else
			CallControlMethod('EditXMLObject', oOldObj, oObj);
	}

	switch (edit_target)
	{
		case 'PI':
		myProfileTabIndex = tab['PI'].curTab;	
		// put code to update object in control here
		oActNode.setAttribute('readOnly', '1');
		BuildDiv('PI', oActNode);
		BuildTable('DV');
		oActNode.removeAttribute('readOnly');
		//if(bDontClick != 1)
			//getObj('vl_PI').click();					
		Hide('ED');
		Show('PI');		
		tab['PI'].head.children[myProfileTabIndex].click();
		//Let WCRS know about the changes to My Profile and update the UC UI display.
		DisplayWebInviteIcon();		
		break;
		
		case 'AB':
		(edit_type=='add') ? UpdateAddressBookLists() : UpdateObjectDisplay('AB', oObj, true);
		if (!aChangedFormElements.length)
		{
		    //var unique_id = oXMLFormObj.selectSingleNode('UniqueID').text;
		    var child = oABNode.selectSingleNode('CONTACT[UniqueID="'+oXMLFormObj.selectSingleNode('UniqueID').text+'"]');
		    oABNode.removeChild(child);
		    table['AB'].refresh();
		}
		SetButtons('AB');
		Show('CT');
		Show('tableAB');
		ConfigureCallListButtons();
		break;
	}


	Hide('ED');

	if(edit_target == 'AB')
	{
	 	sCurDiv = 'CT';
	}
	else
	{	sCurDiv = edit_target;}

	oXMLFormObj=null;
	
	if (b_STEP_DESCRIPTION_ELEMENT)
		UpdateRoutingRuleTables();
		
	if (b_CS_LOCATION_ELEMENT)
	{
		table['CS'].refresh();
		DisplayAccountStatus();
	}
	HighlightRow();
}

function CancelEdit(type)
{

	//Even though the name IgnoreUnsavedEdit() suggests that if the function returns true,
	//one should ignore the results, the converse of it is true.
	//When IgnoreUnsavedEdit() returns true, that means that the unsaved data should be saved. 
	if (IgnoreUnsavedEdit(type)=="true")
	{
		SaveEdit();
	}
	else
	{
		var sType = getObj('editObject').value;
		switch (sType)
		{
			case 'AB':
			var oEditObj = oABNode.selectSingleNode('CONTACT[UniqueID="'+ getObj('editID').value +'"]');
			if (oEditObj && getObj('editType').value=='add')
				oABNode.removeChild(oEditObj);
			break;
			
			case'PI':
			tab['PI'].refresh();
			break;
		}
		Hide('ED');
		if(sType == 'AB')
		{
			sCurDiv = 'CT';
			Show("CT");
			Show('tableAB');
		}
		else
		{
			sCurDiv = sType;
			Show(sType);
		}
		oXMLFormObj=null;
		HighlightRow();
	}
}

function AddEmail(type, mergeValue)
{
	var rows = "<row><input type=\"text\" width=\"250\"></input></row>", new_email;
	if ((type=='edit' || !mergeValue))
	{
		var ret_vals = ParseDelimitedList(Dialog(text('DLG/AB/ADD_E'), 1, rows));
		if (eval(ret_vals[0]))
			new_email = ret_vals[1];
	}
	else
		new_email = mergeValue
	if (new_email)
	{
		new_email = TrimLength(new_email, INPUT_LIMIT_256, true);
		if (IsValid(new_email))
		{
			var EmailsBox = getObj(type+"Emails");
			var match_index = GetMatchingOptionIndex(EmailsBox, new_email, 0);
			if (!match_index)
			{
				EmailsBox.options.length++;
				var index = EmailsBox.options.length-1;
				EmailsBox.options[index].value = new_email;
				EmailsBox.options[index].text = TrimLength(new_email,30) +(((index==0) && (type!='merge')) ? " [Primary]" : "  ");
			}
			else
				Dialog(text('DLG/AB/E_EXI'),0);
		}
		else
			Dialog(text('DLG/AB/E_VAL'),0);
	}
}
	
function EditEmail(type)
{
	var EmailsBox = getObj(type+"Emails");
	var index = EmailsBox.selectedIndex, new_email;
	if (index > -1)
	{
		var rows = "<row><input type=\"text\" width=\"250\" value=\""+ EmailsBox.options[index].value +"\"></input></row>", new_email;

		var ret_vals = ParseDelimitedList(Dialog(text('DLG/AB/EDI_E'), 1, rows));
		if (eval(ret_vals[0]))
			new_email = ret_vals[1];

		if (new_email)
		{
			if (IsValid(new_email))
			{
				if (new_email !== EmailsBox.options[index].value)
				{
					EmailsBox.options[index].value	= new_email;
					EmailsBox.options[index].text	= TrimLength(new_email,30) +(((index == 0) && (type=='edit')) ? " [Primary]" : "  ");
				}
			}
			else
				Dialog(text('DLG/AB/E_VAL'),0);
		}
	}
	else
		Dialog(text('DLG/AB/E_SEL'),0);
}

function DeleteEmail(type)
{
	var oEmailSelect = getObj(type+"Emails");
	if (oEmailSelect.selectedIndex > -1)
	{
		if (oEmailSelect.options.length>0 && eval(ParseDelimitedList(Dialog(text('DLG/AB/E_DEL'),1))[0]))
		{
			while (oEmailSelect.selectedIndex > -1)
			{
				oEmailSelect.options.removeChild(oEmailSelect.options[oEmailSelect.selectedIndex]);
			}
			if (oEmailSelect.options[0])
				oEmailSelect.options[0].text = TrimLength(oEmailSelect.options[0].value,30) + " [Primary]";
		}
	}
	else
		Dialog(text('DLG/AB/E_SEL'),0);
}

function SetPrimaryEmail()
{
	var oEmailSelect	= getObj("editEmails");
	if (oEmailSelect.selectedIndex == 0)
		Dialog(text('DLG/AB/E_PRI'),0);
	else if (oEmailSelect.selectedIndex > 0)
	{
		var oOldPrimary 	= oEmailSelect.options[0];
		(oOldPrimary) ? (oOldPrimary.text = TrimLength(oOldPrimary.value,30)) : null;
		var oNewPrimary 	= oEmailSelect.options.removeChild(oEmailSelect.options[oEmailSelect.selectedIndex]);
		oNewPrimary.text	= TrimLength(oNewPrimary.value,30) + " [Primary]";
		oEmailSelect.options.insertBefore(oNewPrimary, oOldPrimary);
	}
	else
		Dialog(text('DLG/AB/E_SEL'),0);
}

function AddEmailToMergeResolution(index)
{
	if (index > -1)
	{
		var EmailsMergeBox = getObj("mergeEmails");
		var EmailsChoiceBox = getObj("mergeEmailsChoice");
		var str = EmailsChoiceBox.options[index].value;
		if (str)
			AddEmail('merge', str);
	}
}

function BuildMergeEmailOptions()
{
	var x="", i=0, k=0;
	var oLocalEmailsNode = oSynchNode.selectSingleNode('CONFLICT/LOCAL/CONTACT/Emails');
	var oRemoteEmailsNode = oSynchNode.selectSingleNode('CONFLICT/REMOTE/CONTACT/Emails');
	var aLocalEmails = oLocalEmailsNode.selectNodes('LIST/*/*/String[.!=""]');
	while (aLocalEmails.item(i))
	{
		var email = aLocalEmails.item(i++).text;
		x+= "<option value='"+email+"'>"+TrimLength(email,30)+"</option>";
	}
	var aRemoteEmails = oRemoteEmailsNode.selectNodes('LIST/*/*/String[.!=""]');
	while (aRemoteEmails.item(k))
	{
		if (!oLocalEmailsNode.selectSingleNode(".[LIST/*/*/String='"+ aRemoteEmails.item(k).text +"']"))
		{
			var email = aRemoteEmails.item(k).text;
			x+= "<option value='"+email+"'>"+TrimLength(email,30)+"</option>";
		}
		k++
	}
	return x;
}

/*function ShiftAllSelectBoxOptions(box, index, isDownShift)
{
	if (isDownShift)
	{
		for (var i = index; i > 0; i--)
		{
			if (i != 0)
			{
				box.options[i].value	= box.options[i-1].value;
				box.options[i].text		= box.options[i-1].value;
			}
		}
	}
	if (!isDownShift)
	{
		for (var i = box.options.length; i < index; i++)
		{
			if (box.options[i+1])
			{
				box.options[i].value	= box.options[i+1].value;
				box.options[i].text		= box.options[i+1].value;
			}
		}
	}
}*/

// ****************************************************
// *************  ACCOUNT LINK SELECTION  *************
// ****************************************************

function GetUserIDForSelectedAccount(bIsMultAdd)
{
	var actNameForm = getObj("ANUserIDForm");
	if (!bIsMultAdd)
	{
		for (var i=0; i < actNameForm.elements.length; i++)
		{
			if (actNameForm.elements[i].checked == true)
				return actNameForm.elements[i].value;
		}
	}
	return "";
}

function CheckRadioButtonForMatchingAccount(linkedID)
{
	var actNameForm = getObj("ANUserIDForm");
	for (var i=0; i < actNameForm.elements.length; i++)
	{
		if (actNameForm.elements[i].value == linkedID)
		{
			actNameForm.elements[i].checked = true;
			break;
		}
	}
}

function SetAdvancedTab(oObj, bIsEdit)
{
	var bIsContact = (oObj.nodeName=='CONTACT');
	getObj('editMode').value = (bIsEdit)?1:0;
	getObj('editObject').value = (bIsContact)?'AB':'PI';
	getObj('editID').value = (bIsContact) ? oObj.selectSingleNode('UniqueID').text : '';
	if (bIsEdit)
	{
		if (bIsContact)
		{
			var bPrivate = boolVal(oObj.selectSingleNode('.//Private'));
			getObj('editPrivate').checked = bPrivate;
			getObj('editPrivate').defaultChecked = bPrivate;
		}
		else
		{
			var bIsUnlisted = boolVal(oObj.selectSingleNode('.//Unlisted'));
			var bToolbarOnTop 		= (ClientCookie(0, CLIENT_COOKIE_ToolbarOnTop)) ? eval(ClientCookie(0, CLIENT_COOKIE_ToolbarOnTop)) : false;
			var bExpandUserButtons 	= (ClientCookie(0, CLIENT_COOKIE_ExpandUserButtons)) ? eval(ClientCookie(0, CLIENT_COOKIE_ExpandUserButtons)) : false;
			var bSynchReminder 		= (ClientCookie(0, CLIENT_COOKIE_SynchReminder)) ? eval(ClientCookie(0, CLIENT_COOKIE_SynchReminder)) : false;
			
			getObj('editUnlisted').checked 					= bIsUnlisted;
			getObj('editUnlisted').defaultChecked 			= bIsUnlisted;
			
			//getObj('editToolbarOnTop').checked 				= bToolbarOnTop;
			//getObj('editToolbarOnTop').defaultChecked 		= bToolbarOnTop;
			
			getObj('editExpandUserButtons').checked 		= bExpandUserButtons;
			getObj('editExpandUserButtons').defaultChecked 	= bExpandUserButtons;
			
			getObj('editSynchReminder').checked 			= bSynchReminder;
			getObj('editSynchReminder').defaultChecked 		= bSynchReminder;
			
			
			ConfigureFlagsCheckboxes(false, parseFloat(oObj.selectSingleNode('Flags').text));
			getObj('editWAPBridgeCallDelay').value = oObj.selectSingleNode('.//WAPBridgeCallDelay').text;
			
			var oTimeZoneSelect = getObj('editTimeZone');
			var oActDisplayNode = oObj.selectSingleNode('TimeZone/TIME_ZONE_INFO/Display');
			SetSelectIndex(oTimeZoneSelect, oActDisplayNode.text, 1);
		}
	}
}

function GetChangedFormElementNames(type)
{

	var aChanged = new Array, aEditNodes = oRoot.selectNodes("CONTACT_FIELDS/FIELD[@editable='1' or @editable='2']"), i=0;
	while (aEditNodes[i])
	{
		var oEl = getObj(type + aEditNodes[i].getAttribute('name'));
		if (oEl)
		{
			if ("text" == oEl.type || "textarea" == oEl.type || "hidden" == oEl.type)
			{
				if (oEl.value != oEl.defaultValue)
					aChanged[aChanged.length] = oEl.id;
			}
			else if ("select-multiple" == oEl.type)
			{
				// check to see if the number of options has changed
				if (oEl.options.length != parseFloat(oEl.origLength))
					aChanged[aChanged.length] = oEl.id;
				// check to see if the the individual option values or positions have changed
				else
				{
					var option = oEl.options.firstChild;
					while (option)
					{
						if (option.value != option.defaultValue || parseFloat(option.origIndex) != option.index)
						{
							aChanged[aChanged.length] = oEl.id;
							break;
						}
						option=option.nextSibling;
					}
				}
			}
			else if ("select-one" == oEl.type)
			{
				if (oEl.options[oEl.selectedIndex].defaultSelected != true)
					aChanged[aChanged.length] = oEl.id;
			}
			else if ("radio" == oEl.type)
			{
				if (oEl.checked != eval(oEl.defaultValue))
					aChanged[aChanged.length] = oEl.id;
			}
			else if ("checkbox" == oEl.type)
			{
				if (oEl.checked != oEl.defaultChecked)
					aChanged[aChanged.length] = oEl.id;
			}
		}
		i++;
	}
	return aChanged;
}


// ****************************************************
// ******************  NEW RETRIEVAL ******************
// ****************************************************

var b_SEARCH_IS_TYPEAHEAD=0;

var nIdealRecordsPerPage = 10;
var nNumberOfPages;
var nNumRecordsPerPage;
var searchIndexes = new Array;
var nCurSearchIndex = 0;

function ConfigureSearchResultDisplayTabs()
{
	searchIndexes.length = 0;
	var nTempNumberOfPages = (nTotalSearchResults < 16) ? 1 : parseInt(nTotalSearchResults/nIdealRecordsPerPage) + 1;
	//nTempNumberOfPages = parseInt(nTotalSearchResults/nIdealRecordsPerPage) + 1;
	nNumberOfPages = (nTempNumberOfPages < 10) ? nTempNumberOfPages : 10;
	nNumRecordsPerPage = (nNumberOfPages > 9) ? (parseInt(nTotalSearchResults/nNumberOfPages)+1) : nIdealRecordsPerPage;
	/*searchIndexes[0] = 0;
	for (var i=1; i < nNumberOfPages+1; i++)
		searchIndexes[i] = i;
	searchIndexes[searchIndexes.length] = searchIndexes.length;*/
}

function GetUserIDForSelectedAccountRadio()
{
	var aRadios = getObjects("accountLinkRadio"), i=0;
	while (aRadios[i])
	{
		if (aRadios[i].checked)
			return aRadios[i].value;
		else
			i++;
	}
}

function UpdateBatchAddArray(oCheckbox)
{
	var oChild = oBatchNode.selectSingleNode("ID[.="+ oCheckbox.value +"]")
	if (oCheckbox.checked && !oChild)
	{
		xTmp.loadXML("<ID>"+ oCheckbox.value +"</ID>");
		oBatchNode.appendChild(xTmp.firstChild);
	}
	else if (!oCheckbox.checked && oChild)
		oBatchNode.removeChild(oChild);
}

// ****************************************************
// ****** ACTIVE X SYNCH ACTION NOTIFICATION  *********
// ****************************************************

function ImportContactsComplete(b_FILEISVALID, b_IMPORT_COMPLETED)
{
	if (!eval(b_FILEISVALID))
		Dialog(text('ERR/AB/INVAL_IMPT'),0);
	else
	{
		MaxOutProgressBars();
		ClearProgressBars();
		oCurSynchNode = oSelectedSynchNodes.item(n_CUR_SYNCH_ITEM);
		setTimeout('EvaluateCurrentSource()',200);
	}
}

function CurrentSynchComplete(b_SUCCESSFUL)
{
	//if (!b_ABORT_SYNCH_REQUEST)
	//{
		//CheckProgress();
		MaxOutProgressBars();
		ClearProgressBars();
		CheckForAdditionalSynchSources();
	//}
}

var SYNCResults ='';

function CurrentSynchInitComplete(cur_source_eval,results)
{
	//if (!b_ABORT_SYNCH_REQUEST)
	//{
		SYNCResults ='';
	   	if (cur_source_eval=='Failed. Operation aborted')
		{
			//b_ABORT_SYNCH_REQUEST = false;
			return;
		}
		else if (ToLower(cur_source_eval).indexOf('error') == -1)
		{
			MaxOutProgressBars();
			ClearProgressBars();
			allSYNCResults=results;
			SYNCResults = ParseDelimitedList(results);
			setTimeout('ShowSynchSourceEvaluation("' + cur_source_eval + '")',200);
			return;
		}
		ShowSynchSourceEvaluation();
	//}
}

// ****************************************************
// *****************  SYNCHRONIZATION  ****************
// ****************************************************

//isSYNCDIVdisplayed-Always stores if the SYNC DIV was being displayed before user switched to a different tab(only option in UC 4.0 is GROUPS).

var isSYNCDIVdisplayed=0;
//isSYNCDIVdisplayed = 0 => implies that none of the sync DIVs are being displayed
//isSYNCDIVdisplayed = 1 => implies that the ABSY DIV is being displayed with buttons for SYSO
//isSYNCDIVdisplayed = 2 => implies that the ABSY DIV is being displayed with buttons for SYAS
//isSYNCDIVdisplayed = 3 => implies that the ABSY DIV is being displayed with buttons for SYCS
//isSYNCDIVdisplayed = 4 => implies that the ABSY DIV is being displayed with buttons for SYRE
//isSYNCDIVdisplayed = 5 => implies that the ABSY DIV is being displayed with buttons and contents of SYCF
//isSYNCDIVdisplayed = 6 => implies that the ABEX DIV is being displayed with buttons for SYPB

function BeginSynch()
{
	if (!CheckStatus(_AB_ENABLED))
		return false;
	RemoveChildNodes(oSynchSourcesNode);
	del_synch_source_list = CallControlMethod('GetSynchableSourcesList');
	if (ToLower(del_synch_source_list).indexOf('error') > -1)
		del_synch_source_list = null;
	else
	{
		var aSources = ParseDelimitedList(del_synch_source_list), i=0;
		while (aSources[i])
		{
			var oNewNode = oSys.createElement('SOURCE');
			oNewNode.text = aSources[i++];
			oSynchSourcesNode.appendChild(oNewNode);
		}	
	}
	//Hide('tableAB');
	Hide('CTAB');
	BuildDiv('SYSO', oSynchSourcesNode);
	SetButtons('SYSO');
	Show('ABSY');
	isSYNCDIVdisplayed=1;
}

var b_CSV_IMPORTED=0;
var b_CSV_REQUESTED=0;
var oSelectedSynchNodes;
var oCurSynchNode;
var n_CUR_SYNCH_ITEM=0;

function SetSourcesToSynch()
{
	b_ABORT_SYNCH_REQUEST = false;
	var oNodes = oSynchSourcesNode.selectNodes('SOURCE'), i=0;
	while (oNodes[i])
	{
		if (getObj('SynchSourceCheckbox'+oNodes[i].text).checked)
			oNodes[i].setAttribute('synch', 'true');
		i++;
	}
	
	oSelectedSynchNodes = oSynchSourcesNode.selectNodes('SOURCE[@synch="true"]');
	
	// csv file import
	if (getObj('FileImportCheckbox').checked)
	{
		b_CSV_REQUESTED=1;
		MakeProgressBars('CSIM');
		//ImportCSVFile();
		setTimeout('ImportCSVFile()',200);
	}
	// prevent the first source from being evaluated - this will occur in the call
	// from the active x control notifying the completion of the csv import
	else
	{
		if (oSynchSourcesNode.hasChildNodes() && oSelectedSynchNodes)
		{
			oCurSynchNode = oSelectedSynchNodes.item(n_CUR_SYNCH_ITEM);
			EvaluateCurrentSource();
		}
		else
			Dialog(text('SYNC/NO_SEL'),0);
	}
}

function ImportCSVFile()
{
	if (b_CSV_REQUESTED)
	{
		// set the boolean to true first, if a bad path exists, 
		// the control will call NotifyError and reset the boolean to false
		CallControlMethod('ImportContacts', getObj('FileImportPathInput').value+'');
		b_CSV_IMPORTED=1;
	}
}

function EvaluateCurrentSource()
{
	if (oCurSynchNode)
	{
		var source_eval = CallControlMethod('InitSynchContacts', oCurSynchNode.text);
		if (source_eval.indexOf('Synch operation already in progress') >= 0)
		{
			CancelCurrentSynch();
			EvaluateCurrentSource();
		}
		else
			MakeProgressBars('SYEV');
	}
	else
		CloseSynchronize();
} 

function ExpandSYNCNode(syncResult)
{
	var oEl=window.event.srcElement, img_src;
	if (oEl.tagName=='IMG')
	{
		img_src = GetImgSrc(oEl);
		if (img_src=="iExpPlus")
		{
			oEl.src = "img/iExpMinus.gif";
			switch(syncResult)
			{
				case 0: getObj('localAddDIV').style.display='';break;
				case 1: getObj('RemoteAddDIV').style.display='';break;
				case 2: getObj('LocalDeleteDIV').style.display='';break;
				case 3: getObj('RemoteDeleteDIV').style.display='';break;
				case 4: getObj('LocalUpdateDIV').style.display='';break;
				case 5: getObj('RemoteUpdateDIV').style.display='';break;
			}
		}
		else if (img_src=="iExpMinus")
		{
			oEl.src = "img/iExpPlus.gif";
			switch(syncResult)
			{
				case 0: getObj('localAddDIV').style.display='none';break;
				case 1: getObj('RemoteAddDIV').style.display='none';break;
				case 2: getObj('LocalDeleteDIV').style.display='none';break;
				case 3: getObj('RemoteDeleteDIV').style.display='none';break;
				case 4: getObj('LocalUpdateDIV').style.display='none';break;
				case 5: getObj('RemoteUpdateDIV').style.display='none';break;
			}
		}
	}

}

function addSYNCResultsToDisplay(i)
{
	var x= "<div style=\"margin:0% 0% 1% 5%;color:#000;\"> - ";
	x+="<span style=\"width:25%\"><span style=\"color:#00F\"> Name : </span>";
	if(SYNCResults[i]!="" || SYNCResults[i+1]!="")
		x+= SYNCResults[i++]+" "+SYNCResults[i++];
	else 
		i+=2;
	x+="</span>";
	x+="<span style=\"width:25%\"><span style=\"color:#00F\"> Phone Number : </span>";
	if(SYNCResults[i]!="")
		x+= SYNCResults[i++];
	else 
		i++;
	x+="</span>";
	x+="<span style=\"width:25%\"><span style=\"color:#00F\"> Email Address : </span>";
	if(SYNCResults[i]!="")
	x+= SYNCResults[i++];
	else 
		i++;
	x+="</span>";
	x+="</div>";
	return x;
}

function ShowSynchSourceEvaluation(cur_source_eval,var1,var2,var3,var4,var5,var6)
{
	if (oCurSynchNode && cur_source_eval)
	{
		var x="";
		var source_name = oCurSynchNode.text;
		x+= "<div style=\"overflow-y:visible\">";
		x+= "<div class=\"generic_title\"><img src=\"img/iClipboard.gif\" class=\"icon\" style=\"margin:3px 5px;\">"+ text('SYNC/EVAL_RES') +"</div>";
		x+= "<div class=\"sub_title\">"+ source_name +" "+ text('SYNC/EVALTI') +"</div>";
		var bErrorOccured = (cur_source_eval) ? (ToLower(cur_source_eval).indexOf('failed')==0 || ToLower(cur_source_eval).indexOf('invalid')==0) : 0;
		if (!bErrorOccured && !SourceChangesExist(cur_source_eval))
		{
			CancelCurrentSynch();
			x+= "<div class=\"sy_eval_row\" style=\"padding:10px 20px\">"+text('SYNC/NO_ACTION')+"</div>";
			SetButtons('SYAS');
			isSYNCDIVdisplayed=2;
		}
		else
		{
			oCurSynchNode.setAttribute('eval', cur_source_eval);
			var aEvalNums = ConvertEvalString(cur_source_eval);
			if ( (ToLower(cur_source_eval).indexOf('failed') == 0 || ToLower(cur_source_eval).indexOf('invalid') == 0)
				&& !IsNum(aEvalNums[0]) )
			{
				var msg = text('ERR/AB/SYNC_SOURCE') +' '+ oCurSynchNode.text +'\n\n'+ cur_source_eval;
				if (cur_source_eval.indexOf('Please set Outlook as your default') > -1)
					msg += '\n\n' + text('ERR/AB/SYNC_DEFAULT'); //FormatMultilineAlert
				Dialog(msg,0);
				//reset the SYNC DIV display status because when we pass this "if" statement
				//we know that the previous SYNC attempt has failed.
				isSYNCDIVdisplayed=0;
			}
			else
			{
				b_conflict = false;
				var i=0,j;
			//1st SYNC List - Local Add
				x+= "<div class=\""+GetEvalClass(aEvalNums[0], 0)+"\">";			
				if (aEvalNums[0]) 
				{
				   	x+="<span><img src=\"img/iExpPlus.gif\" class=\"icon_hot\" onclick=\"ExpandSYNCNode(0)\"/></span>";
				}
				else
				{
					x+="<span><img src=\"img/pix.gif\" class=\"icon\"/></span>";
				} 
				x+= "<span class=\"sy_eval_cb\">"+ BuildHTMLCheckBox("sy_source_AllowLocalAdd",     aEvalNums[0], 			"", 							((aEvalNums[0]) ? true : "disabled"))+"</span><span class=\"sy_eval_num\">"+aEvalNums[0] +"</span><span class='sy_eval_step'>"+AddNestedBoldTags(text('SYNC/ADDL')) +"</span></div>";
				if (aEvalNums[0]) 
				{
				   	x+= "<div id=\"localAddDIV\" style=\"display:none\">";
					for(j=0;j<aEvalNums[0];j++) 
					{
						x += addSYNCResultsToDisplay(i);
						i += 4;
					}
				   	x+= "</div>";
				}

			//2nd SYNC List - Remote Add

				x+= "<div class=\""+GetEvalClass(aEvalNums[1], 0)+"\">";			
				if (aEvalNums[1]) 
				{
				   	x+="<span><img src=\"img/iExpPlus.gif\" class=\"icon_hot\" onclick=\"ExpandSYNCNode(1)\"/></span>";
				}
				else
				{
					x+="<span><img src=\"img/pix.gif\" class=\"icon\"/></span>";
				}   
				x+= "<span class=\"sy_eval_cb\">"+ BuildHTMLCheckBox("sy_source_AllowRemoteAdd",    aEvalNums[1], 			"", 							((aEvalNums[1]) ? true : "disabled"))+"</span><span class=\"sy_eval_num\">"+aEvalNums[1] +"</span><span class='sy_eval_step'>"+AddNestedBoldTags(text('SYNC/ADDR')) +" "+ source_name +".</span></div>";
				if (aEvalNums[1]) 
				{
				   	x+= "<div id=\"RemoteAddDIV\" style=\"display:none\">";
					for(j=0;j<aEvalNums[1];j++) 
					{
						x += addSYNCResultsToDisplay(i);
						i += 4;
					}
				   	x+= "</div>";
				}

//				x+= "<div class=\""+GetEvalClass(aEvalNums[1], 0)+"\"><span class=\"sy_eval_cb\">"+ BuildHTMLCheckBox("sy_source_AllowRemoteAdd",    aEvalNums[1], 			"", 							((aEvalNums[1]) ? true : "disabled"))+"</span><span class=\"sy_eval_num\">"+aEvalNums[1] +"</span><span class='sy_eval_step'>"+AddNestedBoldTags(text('SYNC/ADDR')) +" "+ source_name +".</span></div>";
			//3rd SYNC List - Local Delete

				x+= "<div class=\""+GetEvalClass(aEvalNums[2], 1)+"\">";			
				if (aEvalNums[2]) 
				{
				   	x+="<span><img src=\"img/iExpPlus.gif\" class=\"icon_hot\" onclick=\"ExpandSYNCNode(2)\"/></span>";
				}   
				else
				{
					x+="<span><img src=\"img/pix.gif\" class=\"icon\"/></span>";
				}
				x+= "<span class=\"sy_eval_cb\">"+ BuildHTMLCheckBox("sy_source_AllowLocalDelete",  aEvalNums[2], 	"CheckDeletePermissions(this)", 		((aEvalNums[2]) ? true : "disabled"))+"</span><span class=\"sy_eval_num\">"+aEvalNums[2] +"</span><span class='sy_eval_step'>"+AddNestedBoldTags(text('SYNC/DELL')) +"</span></div>";
				if (aEvalNums[2]) 
				{
				   	x+= "<div id=\"LocalDeleteDIV\" style=\"display:none\">";
					for(j=0;j<aEvalNums[2];j++) 
					{
						x += addSYNCResultsToDisplay(i);
						i += 4;
					}
				   	x+= "</div>";
				}

//				x+= "<div class=\""+GetEvalClass(aEvalNums[2], 1)+"\"><span class=\"sy_eval_cb\">"+ BuildHTMLCheckBox("sy_source_AllowLocalDelete",  aEvalNums[2], 	"CheckDeletePermissions(this)", 		((aEvalNums[2]) ? true : "disabled"))+"</span><span class=\"sy_eval_num\">"+aEvalNums[2] +"</span><span class='sy_eval_step'>"+AddNestedBoldTags(text('SYNC/DELL')) +"</span></div>";
			//4th SYNC List - Remote Delete

				x+= "<div class=\""+GetEvalClass(aEvalNums[3], 1)+"\">";			
				if (aEvalNums[3]) 
				{
				   	x+="<span><img src=\"img/iExpPlus.gif\" class=\"icon_hot\" onclick=\"ExpandSYNCNode(3)\"/></span>";
				}   
				else
				{
					x+="<span><img src=\"img/pix.gif\" class=\"icon\"/></span>";
				}
				x+= "<span class=\"sy_eval_cb\">"+ BuildHTMLCheckBox("sy_source_AllowRemoteDelete", aEvalNums[3], 	"CheckDeletePermissions(this)", 		((aEvalNums[3]) ? true : "disabled"))+"</span><span class=\"sy_eval_num\">"+aEvalNums[3] +"</span><span class='sy_eval_step'>"+AddNestedBoldTags(text('SYNC/DELR')) +" "+ source_name +".</span></div>";
				if (aEvalNums[3]) 
				{
				   	x+= "<div id=\"RemoteDeleteDIV\" style=\"display:none\">";
					for(j=0;j<aEvalNums[3];j++) 
					{
						x += addSYNCResultsToDisplay(i);
						i += 4;
					}
				   	x+= "</div>";
				}

//				x+= "<div class=\""+GetEvalClass(aEvalNums[3], 1)+"\"><span class=\"sy_eval_cb\">"+ BuildHTMLCheckBox("sy_source_AllowRemoteDelete", aEvalNums[3], 	"CheckDeletePermissions(this)", 		((aEvalNums[3]) ? true : "disabled"))+"</span><span class=\"sy_eval_num\">"+aEvalNums[3] +"</span><span class='sy_eval_step'>"+AddNestedBoldTags(text('SYNC/DELR')) +" "+ source_name +".</span></div>";

			//5th SYNC List - Local Update

				x+= "<div class=\""+GetEvalClass(aEvalNums[4], 1)+"\">";			
				if (aEvalNums[4]) 
				{
				   	x+="<span><img src=\"img/iExpPlus.gif\" class=\"icon_hot\" onclick=\"ExpandSYNCNode(4)\"/></span>";
				}   
				else
				{
					x+="<span><img src=\"img/pix.gif\" class=\"icon\"/></span>";
				}
				x+= "<span class=\"sy_eval_cb\">"+ BuildHTMLCheckBox("sy_source_AllowLocalUpdate",  aEvalNums[4], 	"CheckForConflictSelectBox(this)",		((aEvalNums[4]) ? true : "disabled"))+"</span><span class=\"sy_eval_num\">"+aEvalNums[4] +"</span><span class='sy_eval_step'>"+AddNestedBoldTags(text('SYNC/UPDL')) +"</span></div>";
				if (aEvalNums[4]) 
				{
				   	x+= "<div id=\"LocalUpdateDIV\" style=\"display:none\">";
					for(j=0;j<aEvalNums[4];j++) 
					{
						x += addSYNCResultsToDisplay(i);
						i += 4;
					}
				   	x+= "</div>";
				}

//				x+= "<div class=\""+GetEvalClass(aEvalNums[4], 0)+"\"><span class=\"sy_eval_cb\">"+ BuildHTMLCheckBox("sy_source_AllowLocalUpdate",  aEvalNums[4], 	"CheckForConflictSelectBox(this)",		((aEvalNums[4]) ? true : "disabled"))+"</span><span class=\"sy_eval_num\">"+aEvalNums[4] +"</span><span class='sy_eval_step'>"+AddNestedBoldTags(text('SYNC/UPDL')) +"</span></div>";
			//6th SYNC List - Remote Update
				x+= "<div class=\""+GetEvalClass(aEvalNums[5], 1)+"\">";			
				if (aEvalNums[5]) 
				{
				   	x+="<span><img src=\"img/iExpPlus.gif\" class=\"icon_hot\" onclick=\"ExpandSYNCNode(5)\"/></span>";
				}   
				else
				{
					x+="<span><img src=\"img/pix.gif\" class=\"icon\"/></span>";
				}
				x+= "<span class=\"sy_eval_cb\">"+ BuildHTMLCheckBox("sy_source_AllowRemoteUpdate", aEvalNums[5], 	"CheckForConflictSelectBox(this)", 		((aEvalNums[5]) ? true : "disabled"))+"</span><span class=\"sy_eval_num\">"+aEvalNums[5] +"</span><span class='sy_eval_step'>"+AddNestedBoldTags(text('SYNC/UPDR')) +" "+ source_name +".</span></div>";
				if (aEvalNums[5]) 
				{
				   	x+= "<div id=\"RemoteUpdateDIV\" style=\"display:none\">";
					for(j=0;j<aEvalNums[5];j++) 
					{
						x += addSYNCResultsToDisplay(i);
						i += 4;
					}
				   	x+= "</div>";
				}

//				x+= "<div class=\""+GetEvalClass(aEvalNums[5], 0)+"\"><span class=\"sy_eval_cb\">"+ BuildHTMLCheckBox("sy_source_AllowRemoteUpdate", aEvalNums[5], 	"CheckForConflictSelectBox(this)", 		((aEvalNums[5]) ? true : "disabled"))+"</span><span class=\"sy_eval_num\">"+aEvalNums[5] +"</span><span class='sy_eval_step'>"+AddNestedBoldTags(text('SYNC/UPDR')) +" "+ source_name +".</span></div>";
			//7th SYNC List - Conflicts
				x+= "<div class=\""+GetEvalClass(aEvalNums[7], 0)+"\"><span class=\"sy_eval_cb\">"+"</span><span><img src=\"img/pix.gif\" class=\"icon\"/></span><span class=\"sy_eval_num\">"+aEvalNums[7] +"</span><span class='sy_eval_step'>"+AddNestedBoldTags(text('SYNC/EXIS')) +"</span></div>";
			
				// aEvalNums[6] = number of conflicts
				if (aEvalNums[6] > 0)
				{
					b_conflict = true;
					x+= "<div class=\"sy_eval_row_del\" style=\"font-weight:bold;margin-bottom:10px;\"><span class=\"sy_eval_cb\"></span><span class=\"sy_eval_num\">"+aEvalNums[6]+"</span><span class='sy_eval_step'>"+text('SYNC/CNFL')+".</span></div>";
					// Conflict resolution radio buttons
					x+= "<div class=\"sub_title\">"+ text('SYNC/BATC') +"</div>";
					x+= "<select id=\"sy_conflict_resolve\" style=\"font-size:10px;margin:10px 0px 0px 5px\">";
					x+= 	"<option value=\"manual\">"+ 	text('SYNC/MERG') +"</option>";
					x+= 	"<option value=\"skip\">"+ 		text('SYNC/SKIP') +"</option>";
					x+= 	"<option value=\"ldap\">"+ 		text('SYNC/SAAB') +"</option>";
					x+= 	"<option value=\"external\">"+ 	Insert(source_name, text('SYNC/SAEX')) +"</option>";
					x+= "</select>";
					//x+= "<div class=\"sy_eval_row\"><span class=\"sy_eval_cb\">"+ BuildRadioInput("sy_conflict_resolve", "manual", "", "checked") 	+"</span><span>" + AddNestedBoldTags(text('SYNC/MERG')) +"</span></div>";
					//x+= "<div class=\"sy_eval_row\"><span class=\"sy_eval_cb\">"+ BuildRadioInput("sy_conflict_resolve", "skip", "", "") 			+"</span><span>" + AddNestedBoldTags(text('SYNC/SKIP')) +"</span></div>";
					//x+= "<div class=\"sy_eval_row\"><span class=\"sy_eval_cb\">"+ BuildRadioInput("sy_conflict_resolve", "ldap", "", "") 			+"</span><span>" + AddNestedBoldTags(text('SYNC/SAAB')) +"</span></div>";
					//x+= "<div class=\"sy_eval_row\"><span class=\"sy_eval_cb\">"+ BuildRadioInput("sy_conflict_resolve", "external", "", "") 		+"</span><span>" + AddNestedBoldTags(text('SYNC/SAEX')) +"</span></div>";
				}
				// set the buttons only if the GP is not being displayed.
				if(getObj('CTGP').style.display == "none")
					SetButtons('SYCS');
				// set this variable isSYNCDIVdisplayed to 3(which means SYCS) so that when user clicks on CTAB,
				// users will see the SYCS(SYNC evaluation results)
				isSYNCDIVdisplayed = 3;
			}
		}
		x+= "</div>";
		getObj('ABSY').innerHTML = x;
		Hide('ABEX');
		// set the evaluation display only if GP is not being displayed.
		if(getObj('CTGP').style.display == "none")
			Show('ABSY');
		// if isSYNCDIVdisplayed variable was reset that means we came here by following the following path
		// if-else-if(which means that the SYNC attempt failed) structure above in this function. 
		// In this case, we will be displaying the basic ABSY, 
		// so we need to set the variable isSYNCDIVdisplayed to 1 to display the basic sync buttons.
		if(isSYNCDIVdisplayed==0)
			isSYNCDIVdisplayed=1;
	}
	else
		CheckForAdditionalSynchSources();

	//reset the contents of the SYNC results.
	localAdd='';
	remoteAdd='';
	localDelete='';
	remoteDelete='';
	localUpdate='';
	remoteUpdate='';
}

function GetEvalClass(num, bDelete)
{
	return ((num==0) ? 'sy_eval_row_dis' : ((bDelete) ? 'sy_eval_row_del':'sy_eval_row'));
}

function SynchronizeCurrentSource()
{
	var allow_synch_operations, resolve_method = 'abort', resolve_radio;
	allow_synch_operations  = '|' + IsCheckedOrDisabled(getObj('sy_source_AllowLocalAdd'));
	allow_synch_operations += '|' + IsCheckedOrDisabled(getObj('sy_source_AllowRemoteAdd'));
	allow_synch_operations += '|' + IsCheckedOrDisabled(getObj('sy_source_AllowLocalDelete'));
	allow_synch_operations += '|' + IsCheckedOrDisabled(getObj('sy_source_AllowRemoteDelete'));
	allow_synch_operations += '|' + IsCheckedOrDisabled(getObj('sy_source_AllowLocalUpdate'));
	allow_synch_operations += '|' + IsCheckedOrDisabled(getObj('sy_source_AllowRemoteUpdate'));

	oCurSynchNode.setAttribute('operations', allow_synch_operations);
	
	if (b_conflict)
	{
		resolve_select = getObj('sy_conflict_resolve');
		resolve_method = resolve_select.value;
	}
	
	if (!b_conflict || (b_conflict && resolve_select))
	{
		CheckForLocalChanges(resolve_radio);
		oCurSynchNode.setAttribute('resolve_method', resolve_method);
		if (resolve_method == 'manual')
			ManuallyResolveConflicts();
		else
			CompleteSynchContacts();
	}
}

function CompleteSynchContacts()
{
	if (SourceChangesExist(oCurSynchNode.getAttribute('eval')))
	{
		var res = CallControlMethod('CompleteSynchContacts', oCurSynchNode.getAttribute('resolve_method'), oCurSynchNode.getAttribute('operations'));
		MakeProgressBars('SYCS');
	}
	else
	{
		CancelCurrentSynch();
		CheckForAdditionalSynchSources();
	}
}

function CheckForLocalChanges(oResolveRadio)
{
	var aEvalNums = ParseDelimitedList(oCurSynchNode.getAttribute('eval')), bool='false';
	// check for local adds, local deletes, local updates, and local conflicts
	if (( (aEvalNums[0] > 0 && eval(IsCheckedOrDisabled(getObj('sy_source_AllowLocalAdd')))) ||
		  (aEvalNums[2] > 0 && eval(IsCheckedOrDisabled(getObj('sy_source_AllowLocalDelete')))) ||
		  (aEvalNums[4] > 0 && eval(IsCheckedOrDisabled(getObj('sy_source_AllowLocalUpdate')))) ||
		  (aEvalNums[6] > 0))  && n_CUR_SYNCH_ITEM > 0)
	{
		bool='true';
	}
	oCurSynchNode.setAttribute('localchange', bool);
}

function CheckDeletePermissions(oCheckbox)
{
	if (!oCheckbox.checked && eval(oCheckbox.value))
	{
		var msg = text('DLG/AB/'+ ((oCheckbox.name=='sy_source_AllowLocalDelete')?'SYNC_NO_LOC_DEL':'SYNC_NO_REM_DEL') ); //FormatMultilineAlert( )
		Dialog(msg,0)
	}
	return true;
}

function CheckForConflictSelectBox()
{
	var oLocalUpdateCheckbox = getObj('sy_source_AllowLocalUpdate');
	var oRemoteUpdateCheckbox = getObj('sy_source_AllowRemoteUpdate');
	var oConflictResolutionSelect = getObj('sy_conflict_resolve');
	// if there is a conflict and both boxes are enabled and checked
	// allow any conflict resolution
	if (oConflictResolutionSelect && 
		((!oLocalUpdateCheckbox.disabled 	&& oLocalUpdateCheckbox.checked) 	|| oLocalUpdateCheckbox.disabled) && 
		((!oRemoteUpdateCheckbox.disabled 	&& oRemoteUpdateCheckbox.checked) 	|| oRemoteUpdateCheckbox.disabled))
	{
		oConflictResolutionSelect.disabled = false;
	}
	// if there is a conflict and they've unchecked the boxes
	// force a skip of the merge so resolved information isn't lost
	// by the disallowed remote or local updates
	else if (oConflictResolutionSelect)
	{
		oConflictResolutionSelect.disabled = true;
		oConflictResolutionSelect.selectedIndex = 1;
	}
}

function IsCheckedOrDisabled(check_box)
{
	if (check_box.checked)
		return 'true';
	if (check_box.disabled)
		return 'true';
	return 'false';
}

function ConvertEvalString(string)
{
	var aEvalNums = ParseDelimitedList(string), i=0;
	while (aEvalNums[i])
		aEvalNums[i] = parseFloat(aEvalNums[i++]);
	return aEvalNums;
}

function BuildResynchMessage()
{
	var x = "";
	x+= "<div class='generic_title'><img src=\"img/iClipboard.gif\" class=\"icon\" style=\"margin:3px 5px;\">" +text('SYNC/SYNRES') +"</div>";
	x+= "<div class='sub_title'>" + text('SYNC/SYNRES') +"</div>";
	var msg = text('SYNC/RESYN');
	var re = new RegExp('¶', 'g');
	x+= "<div class=\"sy_eval_row\" style=\"padding:10px 20px\">"+ msg.replace(re, '<br><br>') +"</div>";
	getObj('ABSY').innerHTML = x;
	Hide('ABEX');
	Show('ABSY');
	isSYNCDIVdisplayed=4;
	SetButtons('SYRE');
}

function RepeatSynchronizationRequired()
{
	var i=0;
	while (oSelectedSynchNodes.item(i))
	{
		if (eval(oSelectedSynchNodes.item(i).getAttribute('localchange')))
			return true;
		i++;
	}
	return false;
}

function ResetLocalChangeFlags()
{
	var i=0;
	while (oSelectedSynchNodes.item(i))
		oSelectedSynchNodes.item(i++).setAttribute('localchange', 'false');
}

function SourceChangesExist(cur_source_eval)
{
	var aEvalNums = ConvertEvalString(cur_source_eval)
	for (var i=0; i < 7; i++)
	{
		if (aEvalNums[i])
			return true;
	}
	return false;
}

function CheckForAdditionalSynchSources()
{
	if (oSelectedSynchNodes && oSelectedSynchNodes.item(n_CUR_SYNCH_ITEM+1))
	{
		//b_ABORT_SYNCH_REQUEST = false;
		oCurSynchNode = oSelectedSynchNodes.item(++n_CUR_SYNCH_ITEM);
		EvaluateCurrentSource();
	}
	else
	{
		if (b_ABORT_SYNCH_REQUEST || !RepeatSynchronizationRequired())
			CloseSynchronize();
		else
		{
			n_CUR_SYNCH_ITEM=0;
			oCurSynchNode = oSelectedSynchNodes.item(n_CUR_SYNCH_ITEM);
			BuildResynchMessage();
		}
		return;
	}
}

var b_ABORT_SYNCH_REQUEST = false;
var conflict_num = 0;

function CancelActiveSynch()
{
	CancelCurrentSynch();
	ResetSynchVariables();
	Hide('ABEX');
	BeginSynch();
}

function CancelCurrentSynch()
{
	b_ABORT_SYNCH_REQUEST = true;
	CallControlMethod('AbortSynchContacts');
	oCurSynchNode = null;
	//oSelectedSynchNodes = null;
	//Hide('ABSY');
	//Hide('ABEX');
}

function CloseSynchronize()
{
	Hide('ABSY');
	isSYNCDIVdisplayed=0;
	Hide('ABEX');
	
	ResetSynchVariables();
	UpdateAddressBookLists();
	Show('tableAB');
	Show('CTAB');
	SetButtons('AB');
	
	SetTimestampForNextSynch(7);
}

function ResetSynchVariables()
{
	n_CUR_SYNCH_ITEM=0;
	b_ABORT_SYNCH_REQUEST = false;
	conflict_num = 0;
	oCurSynchNode = null;
	RemoveChildNodes(oBarsNode);
}

function ManuallyResolveConflicts()
{
	var oConflictNode = oSynchNode.selectSingleNode('CONFLICT'), oLocal, oRemote;
	if (oConflictNode)
		oSynchNode.removeChild(oConflictNode);
	oConflictNode = AddNode(oSynchNode, 'CONFLICT');
	oLocal = CallControlMethod('GetSynchConflictItem', 'local');
	oRemote = CallControlMethod('GetSynchConflictItem', 'remote');
	if (oLocal.xml || oLocal != 'done.')
	{
		oLocal = oLocal.firstChild.cloneNode(true);
		oRemote = oRemote.firstChild.cloneNode(true);
		var oLocalNode 	= AddNode(oConflictNode, 'LOCAL');
		var oRemoteNode = AddNode(oConflictNode, 'REMOTE');
		oLocalNode.appendChild(oLocal);
		oRemoteNode.appendChild(oRemote);
		oConflictNode.appendChild(oRoot.selectSingleNode('CONTACT_FIELDS').cloneNode(true));
		DetermineFieldConflicts();
		BuildDiv('SYCF', oConflictNode);
		getObj('ABSY').scrollTop=0;
		isSYNCDIVdisplayed=5;
	}
	else
		CompleteSynchContacts();
}

function SaveConflictResolution()
{
	var b_CONFLICT_VALS_SET = true;
	var resolution_type = getObj("sy_conflict_resolve_select").value;
	// Check to make sure all conflict values have been set
	if (resolution_type == "form")
	{
		var aConflictFields = oSynchNode.selectNodes('CONFLICT/CONTACT_FIELDS/FIELD[@editable=2 and @conflict=1]');
		var aResolvedFields = oSynchNode.selectNodes('CONFLICT/CONTACT_FIELDS/FIELD[@editable=2 and @conflict=1 and @resolved="true"]');
		var aChangedFormElements = GetChangedFormElementNames('merge');
		if (aResolvedFields.length < aConflictFields.length)
			b_CONFLICT_VALS_SET = eval(ParseDelimitedList(Dialog(text('DLG/AB/MG_SAVE'),1))[0]);
	}
	if (b_CONFLICT_VALS_SET)
	{
		var oNewContact = oSynchNode.selectSingleNode('CONFLICT/LOCAL/CONTACT').cloneNode(true);
		var resolution = (resolution_type == "form") ? UpdateMergeContact(oNewContact, aChangedFormElements) : resolution_type;
		var resolve_result = CallControlMethod("SetSynchConflictResult", oSynchNode.selectSingleNode('CONFLICT/LOCAL/CONTACT'), resolution);
		if (resolve_result == "done." )
		{
			conflict_num++;
			ManuallyResolveConflicts();
		}
	}
}

function UpdateMergeContact(oContact, aChangedFormElements)
{
	var i=0;
	while (aChangedFormElements[i])
	{
		var node_name = aChangedFormElements[i].replace('merge', '');
		var value, x_path = './/'+node_name;
		
		switch(aChangedFormElements[i])
		{	
			case 'mergeEmails':
				var oOptions = getObj('mergeEmails').options, k=0, j=0;
				var oEmailsNode = oContact.selectSingleNode(x_path);
				var oStrings = oEmailsNode.selectNodes('LIST//String');

				// remove existing strings
				while (oStrings[k])
					oEmailsNode.selectSingleNode('LIST').removeChild(oStrings[k++].parentNode.parentNode);
					
				// reset NumberOfObjects in case the select box is empty
				oEmailsNode.selectSingleNode('LIST/NumberOfObjects').text = '0';
				
				// add new nodes from options
				while (oOptions[j])
					AddChildNodeToListObject(oEmailsNode, oOptions[j++].value);
			
				x_path = null;
				break;
				
			case 'mergePrivate':
				value = (getObj(aChangedFormElements[i]).checked)?'true':'false';
				break;
				
			// account only edits
			case 'mergeUnlisted':
			case 'mergeTimeZone':	
			case 'mergeToolbarOnTop':	
			case 'mergeExpandUserButtons':
			case 'mergeRoutingEnabled':
			case 'mergePositiveCallerID':
			case 'mergeUsingSharedDevice':
			case 'mergeIncludeAccountsInPhoneClientSearch':
			case 'mergeASRConfirmationPrompts':
			case 'mergePhoneClientAutoLogon':
				x_path = null;
				value = null;
				break;
			
			default:
				value = getObj(aChangedFormElements[i]).value;
		}
		
		// if the field being update is a phone number, the BuildDiv('PI') will choke when it attempts
		// to output a value with formatting characters - ()
		var oFieldNode = oRoot.selectSingleNode('CONTACT_FIELDS/FIELD[@name="'+x_path+'"]');
		if (oFieldNode && oFieldNode.getAttribute('type')=='TYPE_STRING_PHONE')
			value = StripPhoneNumber(sValue);
		
		if (x_path)
			oContact.selectSingleNode(x_path).text = value;
		i++;
	}
	return oContact;
}

function DetermineFieldConflicts()
{
	// (Text Description, Property Name, editable [boolean], is matching [boolean], type, max length)
	var oEditableNodes = oSynchNode.selectNodes('CONFLICT/CONTACT_FIELDS/FIELD[@editable=2]'), i=0;
	while (oEditableNodes.item(i))
	{
		// if the field is editable and the values don't match
		if (eval(oEditableNodes.item(i).getAttribute('editable')) && !ValuesMatch(oEditableNodes.item(i)))
			oEditableNodes.item(i).setAttribute('conflict', 1);
		i++;
	}
}

function ValuesMatch(oNode)
{
	var path = oNode.getAttribute('name');
	var value1 = oSynchNode.selectSingleNode('CONFLICT/LOCAL/CONTACT/'+path).text;
	var value2 = oSynchNode.selectSingleNode('CONFLICT/REMOTE/CONTACT/'+path).text;
	if (oNode.getAttribute('type')=='TYPE_STRING_PHONE')
	{
		value1 = StripPhoneNumber(value1);
		value2 = StripPhoneNumber(value2);
	}
	return (value1 == value2);
	//return CompareNoCase(value1, value2);
}

function FormatEmailDisplay(strEmails)
{
	if (strEmails.length < 2)
		return "";
	var tVals = ParseDelimitedList(strEmails);
	if (tVals.length > 1)
		strEmails = DelimitList(tVals,',');
	return strEmails.substring(1,strEmails.length);
}

function SetMergeFormValue(b_local_contact, prop_name)
{
	var val = oSynchNode.selectSingleNode('CONFLICT/'+ ((b_local_contact)?'LOCAL':'REMOTE') +'/CONTACT/'+prop_name).text;
	getObj("merge"+prop_name).value = (prop_name != 'Emails') ? val : FormatEmailDisplay(val);
	var oConflictField = oSynchNode.selectSingleNode('CONFLICT/CONTACT_FIELDS/FIELD[@name="'+prop_name+'"]');
	if (oConflictField)
		oConflictField.setAttribute('resolved', 'true');
}

var TYPE_BOOL = 1;
var TYPE_STRING = 2;
var TYPE_STRING_PHONE = 4;
var TYPE_STRING_MULTILINE = 5;
var TYPE_SELECTIONLIST = 6;
var TYPE_DROPDOWNLIST = 7;
var TYPE_CHECKBOX = 8;
