Index: sandbox/2.2.0.2/contactcenter/js/cc.js
===================================================================
--- sandbox/2.2.0.2/contactcenter/js/cc.js	(revision 4305)
+++ sandbox/2.2.0.2/contactcenter/js/cc.js	(revision 4498)
@@ -74,4 +74,7 @@
 /* Connections Variables */
 var CC_conn_last_selected = 0;
+
+/* Grupos inicialmente selecionados */
+var CC_initial_selected_grps = new Array();
 
 /***********************************************\
@@ -344,12 +347,21 @@
 
 		/* Populate Connection Types */
-		i = 1;
+		/*
+		 * Código não funcional com o expresso.
+		 */
+		/*i = 1;
 		for (j in data[4])
 		{
 			Element('cc_conn_type').options[i] = new Option(data[4][j], j);
 			i++;
-		}
-
+		}*/
+		
 		/* Populate Relations Types */
+		/*
+		 * Código conflitante com a modificação de seleção de grupos durante
+		 * a criação de um novo contato. Também foi verificado que este código não
+		 * é funcional.
+		 */
+		/*
 		i = 0;
 		for (j in data[5])
@@ -357,4 +369,13 @@
 			Element('cc_rels_type').options[i] = new Option(data[5][j], j);
 			i++;
+		}*/
+		
+		/* Populate available groups */
+		i = 0;
+		var grupos = data[5];
+		for (var grupo in grupos)
+		{
+			Element('id_grps_available').options[i] = new Option(grupos[grupo]['title'], grupos[grupo]['id_group']);
+			i++;
 		}
 
@@ -364,4 +385,55 @@
 
 	Connector.newRequest('populateFullAddConst', CC_url+'get_contact_full_add_const', 'GET', handler);
+}
+
+/*
+ * Função que faz a seleção do grupo.
+ * Autor: Luiz Carlos Viana Melo - Prognus
+ */
+function selectGroup()
+{
+	grps_avail = Element('id_grps_available');
+	grps_selec = Element('id_grps_selected');
+	
+	for (i = 0; i < grps_avail.length; i++)
+	{
+		if (grps_avail.options[i].selected) {
+			isSelected = false;
+
+			for(var j = 0;j < grps_selec.options.length; j++) {																			
+				if(grps_selec.options[j].value === grps_avail.options[i].value){
+					isSelected = true;
+					break;	
+				}
+			}
+
+			if(!isSelected){
+
+				option = document.createElement('option');
+				option.value = grps_avail.options[i].value;
+				option.text = grps_avail.options[i].text;
+				option.selected = false;
+				grps_selec.options[grps_selec.options.length] = option;
+										
+			}
+											
+		}
+	}
+	
+	for (j =0; j < grps_avail.options.length; j++)
+		grps_avail.options[j].selected = false;
+}
+
+/*
+ * Função que remove um grupo selecionado.
+ * Autor: Luiz Carlos Viana Melo - Prognus
+ */
+function deselectGroup()
+{
+	grps_selec = Element('id_grps_selected');
+
+	for(var i = 0;i < grps_selec.options.length; i++)				
+		if(grps_selec.options[i].selected)
+			grps_selec.options[i--] = null;
 }
 
@@ -384,7 +456,32 @@
 		Element('cc_full_add_contact_id').value = data['cc_full_add_contact_id'];
 		populatePersonalData(data['personal']);
+		populateContactGroups(data['groups']);
 		//populateRelations(data['relations']);
 	};
 	Connector.newRequest('populateFullEdit', '../index.php?menuaction=contactcenter.ui_data.data_manager&method=get_full_data&id=' + id + "&catalog="+catalog, 'GET', handler);
+}
+
+/*
+ * Função que preenche a lista de grupos a qual o contato pertence.
+ * Autor: Luiz Carlos Viana Melo - Prognus
+ */
+function populateContactGroups(groupsData)
+{
+	groups_selected = Element('id_grps_selected');
+	var i = 0;
+	CC_initial_selected_grps = new Array();
+	for (var group in groupsData)
+	{
+		var id_group = groupsData[group]['id_group'];
+		option = document.createElement('option');
+		option.value = id_group;
+		option.text = groupsData[group]['title'];
+		option.selected = false;
+		groups_selected.options[i++] = option;
+		CC_initial_selected_grps[id_group] = new Array();
+		CC_initial_selected_grps[id_group]['id_group'] = id_group;
+		CC_initial_selected_grps[id_group]['title'] = groupsData[group]['title'];
+		CC_initial_selected_grps[id_group]['short_name'] = groupsData[group]['short_name'];
+	}
 }
 
@@ -441,4 +538,10 @@
 function resetFullAdd()
 {
+	/* Groups */
+	gprs_selected = Element('id_grps_selected');
+	for (j =0; j < gprs_selected.options.length; j++) {
+		gprs_selected.options[j].selected = false;
+		gprs_selected.options[j--] = null;
+	}
 	/* Clear information container */
 	CC_contact_full_info = new Array();
@@ -706,6 +809,73 @@
 	}
 
+	data['groups'] = getAddedRemovedGroups();
+	
 	var serial = serialize(data);
 	return 'data=' + escape(serialize(data));
+}
+
+/*
+ * Função que retorna os grupos que foram anteriormente selecionados, adicionados ou removidos pelo
+ * usuário. O formato retornado é um array contendo:
+ * ['added'] {
+ * 	[id_group] {
+ * 		'id_group' 		=> o ID do grupo
+ * 		'title'			=> o título do grupo
+ * 	}
+ * },
+ * ['removed'] {
+ * 	[id_group] {
+ * 		'id_group' 		=> o ID do grupo
+ * 		'title'			=> o título do grupo
+ * 	}
+ * }
+ * Autor: Luiz Carlos Viana Melo - Prognus
+ */
+function getAddedRemovedGroups()
+{
+	var selected_groups = getSelectedGroups();
+	var added_groups = diffContactIDArray(selected_groups, CC_initial_selected_grps);
+	var removed_groups = diffContactIDArray(CC_initial_selected_grps, selected_groups);
+	var groups = new Array();
+	groups['added'] = added_groups;
+	groups['removed'] = removed_groups;
+	return groups;
+}
+
+/*
+ * Função que retorna os grupos que foram selecionados pelo usuário. O formato retornado é:
+ * [id_group] {
+ * 	'id_group' 		=> o ID do grupo
+ * 	'title'			=> o título do grupo
+ * }
+ * Autor: Luiz Carlos Viana Melo - Prognus
+ */
+function getSelectedGroups()
+{
+	var gprs_selected = Element('id_grps_selected');
+	var data = new Array();
+	for(i = 0; i < gprs_selected.options.length; i++)
+	{
+		var id_group = gprs_selected.options[i].value;
+		data[id_group] = new Array();
+		data[id_group]['id_group'] = id_group;
+		data[id_group]['title'] = gprs_selected.options[i].text;
+	}
+	return data;
+}
+
+/*
+ * Função que retorna a diferença entre 2 arrays com ID dos contatos.
+ * Autor: Luiz Carlos Viana Melo - Prognus
+ */
+function diffContactIDArray(array1, array2)
+{
+	var diff = new Array();
+	for (var group in array1)
+	{
+		if (!array2[group])
+			diff.push(array1[group]);
+	}
+	return diff;
 }
 
