Index: contrib/z-push/backend/BackendCalendarExpresso.php
===================================================================
--- contrib/z-push/backend/BackendCalendarExpresso.php	(revision 4000)
+++ contrib/z-push/backend/BackendCalendarExpresso.php	(revision 4219)
@@ -52,20 +52,27 @@
 
 	function GetMessageList($folderid, $cutoffdate) {
-		debugLog('CalendarExpresso::GetMessageList('.$this->_uidnumber.')');
+		debugLog('CalendarExpresso::GetMessageList('.$this->_uidnumber.', '.$cutoffdate.')');
+		if (TRACE_UID !== false and $cutoffdate !== 0  and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageList-> Filtra eventos com data maior que cutoffdate: '.date("d/m/Y G:i:s",$cutoffdate).', cutoffdate_timestamp: '.$cutoffdate);
 		if ($folderid != "calendar") return false;
 
+		$cal_ids = null;
 		$messages = array();
 		try {
 			$result = pg_query($this->db,"BEGIN;");
 			if ($result == FALSE) throw new Exception(pg_last_error($this->db));
-			if ($cutoffdate == 0) $result = pg_query($this->db, "select c.cal_id, c.last_update, c.datetime, c.cal_type from phpgw_cal c join phpgw_cal_user u on (c.cal_id = u.cal_id) where u.cal_login ='" . $this->_uidnumber . "'and c.reference = 0;");
-			else $result = pg_query($this->db, "select c.cal_id, c.last_update, c.datetime, c.cal_type from phpgw_cal c join phpgw_cal_user u on (c.cal_id = u.cal_id) where u.cal_login ='" . $this->_uidnumber . "'and c.reference = 0 and c.edatetime > " . $cutoffdate . ";");
+			if ($cutoffdate == 0) $result = pg_query($this->db, "select c.cal_id, c.last_update, c.datetime, c.cal_type, c.title from phpgw_cal c join phpgw_cal_user u on (c.cal_id = u.cal_id) where u.cal_login ='" . $this->_uidnumber . "'and c.reference = 0;");
+			else $result = pg_query($this->db, "select c.cal_id, c.last_update, c.datetime, c.cal_type, c.title from phpgw_cal c join phpgw_cal_user u on (c.cal_id = u.cal_id) where u.cal_login ='" . $this->_uidnumber . "'and c.reference = 0 and c.edatetime > " . $cutoffdate . ";");
 			if ($result == FALSE) throw new Exception(pg_last_error($this->db));
 			while ($row = pg_fetch_row($result)) {
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageList-> Lê item do BD (cal_id: '.$row[0].', title: '.$row[4].', last_update: '.date("d/m/Y G:i:s",substr($row[1], 0, strlen($row[1])-3)).', last_update_timestamp: '.$row[1].', datetime: '.date("d/m/Y G:i:s",$row[2]).', datetime_timestamp: '.$row[2].', cal_type: '.$row[3].')');
 				$result_recur = pg_query($this->db,"select recur_enddate from phpgw_cal_repeats where cal_id = " . $row[0] . ";");
 				if ($result_recur == FALSE) throw new Exception(pg_last_error($this->db));
 				if ($row[3] == 'M') {
 					if ($recur_enddate = pg_fetch_result($result_recur, 0, 0)) {
-						if ($recur_enddate < $row[2]) continue; // Nao sincroniza este evento, porque a data final da recorrencia eh menor que a data inicial do evento. Eh o BD do Expresso que esta inconsistente.
+						if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageList-> Evento '.$row[0].' é recorrente: recur_enddate : '.date("d/m/Y G:i:s",$recur_enddate).', recur_enddate_timestamp: '.$recur_enddate);
+						if ($recur_enddate < $row[2]) {
+							if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageList-> ERRO: Esse evento não será adicionado na lista porque o campo phpgw_cal_repeats.recur_enddate é menor que o campo phpgw_cal.datetime. Corrija o valor de um dos campos');
+							continue; // Nao sincroniza este evento, porque a data final da recorrencia eh menor que a data inicial do evento. Eh o BD do Expresso que esta inconsistente.
+						}
 					}
 				}
@@ -76,4 +83,21 @@
 				$message["flags"] = 1; // always 'read'
 				$messages[] = $message;
+				if ($cal_ids === null) $cal_ids = $row[0];
+				else $cal_ids = $cal_ids . ',' . $row[0];
+			}
+			// Eventos com reference invalidos
+			if ($cutoffdate == 0) $result_invalid_ref = pg_query($this->db, "select c.cal_id, c.last_update, c.datetime, c.cal_type, c.title, c.reference from phpgw_cal c join phpgw_cal_user u on (c.cal_id = u.cal_id) where u.cal_login ='" . $this->_uidnumber . "'and c.reference <> 0 and c.reference not in(".$cal_ids.");");
+			else $result_invalid_ref = pg_query($this->db, "select c.cal_id, c.last_update, c.datetime, c.cal_type, c.title, c.reference from phpgw_cal c join phpgw_cal_user u on (c.cal_id = u.cal_id) where u.cal_login ='" . $this->_uidnumber . "'and c.reference <> 0 and c.reference not in(".$cal_ids.") and c.datetime > ". $cutoffdate .";");
+			if ($result_invalid_ref == FALSE) throw new Exception(pg_last_error($this->db));
+			while ($row_invalid_ref = pg_fetch_row($result_invalid_ref)) {
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageList-> ERRO: Evento com campo reference inválido (cal_id: '.$row_invalid_ref[0].', title: '.$row_invalid_ref[4].', reference: '.$row_invalid_ref[5].', last_update: '.date("d/m/Y G:i:s",substr($row_invalid_ref[1], 0, strlen($row[1])-3)).', last_update_timestamp: '.$row_invalid_ref[1].', datetime: '.date("d/m/Y G:i:s",$row_invalid_ref[2]).', datetime_timestamp: '.$row_invalid_ref[2].', cal_type: '.$row_invalid_ref[3].')');
+			}
+			// Evento fora da faixa filtrada
+			if ($cutoffdate !== 0) {
+				$result_out_cutoffdate = pg_query($this->db, "select c.cal_id, c.datetime, c.cal_type, c.title, c.reference from phpgw_cal c join phpgw_cal_user u on (c.cal_id = u.cal_id) where u.cal_login ='" . $this->_uidnumber . "'and c.datetime <= ". $cutoffdate .";");
+				if ($result_out_cutoffdate == FALSE) throw new Exception(pg_last_error($this->db));
+				while ($row_out_cutoffdate = pg_fetch_row($result_out_cutoffdate)) {
+					if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageList-> INFORMACAO: Evento com campo datetime fora da faixa filtrada (cal_id: '.$row_out_cutoffdate[0].', title: '.$row_out_cutoffdate[3].', reference: '.$row_out_cutoffdate[4].', datetime: '.date("d/m/Y G:i:s",$row_out_cutoffdate[1]).', datetime_timestamp: '.$row_out_cutoffdate[1].', cal_type: '.$row_out_cutoffdate[2].')');
+				}
 			}
 			$result = pg_query($this->db,"COMMIT;");
@@ -83,4 +107,5 @@
 			debugLog("exception -> " . $e->getMessage() . " - ARQUIVO: " . $e->getFile() . " - LINHA: " . $e->getLine());
 		}
+		if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageList-> Fim normal da função');
 		return $messages;
 	}
@@ -132,4 +157,5 @@
 		 		$message["id"] = $id;
 		 		$message["flags"] = 1;
+		 		if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::StatMessage-> mod: '.$message["mod"].', id: '.$message["id"]);
 		 		return $message;
 		 	}
@@ -141,4 +167,5 @@
 			debugLog("exception -> " . $e->getMessage() . " - ARQUIVO: " . $e->getFile() . " - LINHA: " . $e->getLine());
 		}
+		if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::StatMessage: ERRO: Não encontrou valor para o campo last_update para esse evento.');
 		return false;
 	}
@@ -159,4 +186,5 @@
 			if ($result == FALSE) throw new Exception(pg_last_error($this->db));
 			if ($row = pg_fetch_row($result)) {
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageDAO-> Lê evento do DB para enviar para o celular (cal_id: '.$row[0].', title:'.$row[1].', location: '.$row[2].', mdatetime: '.$row[3].', datetime: '.$row[4].', edatetime: '.$row[5].', reference: '.$row[7].', isPublic: '.$row[8].')');
 				if ($row[7] != 0) $has_parent_event = true;
 				else $has_parent_event = false;
@@ -237,4 +265,5 @@
 				if ($result == FALSE) throw new Exception(pg_last_error($this->db));
 				if ($row = pg_fetch_row($result)){
+					if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageDAO-> Lê recorrência do evento (recur_type: '.$row[0].', recur_use_end: '.$row[1].', recur_enddate: '.$row[2].', recur_interval: '.$row[3].', recur_data: '.$row[4].', recur_exception: '.$row[5].')');
 					$recur = new SyncRecurrence();
 					// Converte os tipos do Expresso para os tipos do Protocolo ActiveSync
@@ -282,4 +311,5 @@
 					}
 					$message->recurrence = $recur;
+					if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageDAO-> Fim do Bloco - Lê recorrência do evento.');
 				}
 
@@ -288,4 +318,5 @@
 				if ($result == FALSE) throw new Exception(pg_last_error($this->db));
 				while ($row_recur_exception = pg_fetch_row($result)) {
+					if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageDAO: Lê evento único da recorrência com id: '.$row_recur_exception[0]);
 					$recur_exception = $this->GetMessageDAO($row_recur_exception[0]);
 					if ($recur_exception instanceof SyncAppointment) {
@@ -293,4 +324,5 @@
 						array_push($message->exceptions, $recur_exception);
 					}
+					if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageDAO-> Fim do Bloco - Lê evento único da recorrência com id: '.$row_recur_exception[0]);
 				}
 
@@ -299,4 +331,5 @@
 					$array_timestamps_recur_deleted = explode(",",$row[5]);
 					foreach ($array_timestamps_recur_deleted as $timestamp_recur_deleted) {
+						if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageDAO: Timestamps dos eventos únicos da recorrência do tipo deletados: '.$timestamp_recur_deleted);
 						$recur_deleted = new SyncAppointment();
 						$recur_deleted->deleted = '1';
@@ -307,4 +340,5 @@
 				}
 				//TODO: Tratar Participantes do Evento
+
 			}
 			$result = pg_query($this->db,"COMMIT;");
@@ -315,4 +349,5 @@
 			return;
 		}
+		if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::GetMessageDAO-> Fim do Bloco - Lê evento do DB para enviar para o celular: '.$id);
 		return $message;
 	}
@@ -354,4 +389,5 @@
 			return false;
 		}
+		if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog("CalendarExpresso::DeleteMessage-> Fim normal da Função.");
 		return true;
 	}
@@ -363,4 +399,5 @@
 	function ChangeMessageDAO($id, $message) {
 		debugLog('CalendarExpresso::ChangeMessageDAO('.$id.', ..)');
+		if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> O evento do celular será inserido/atualizado no BD com o ID: '.$id);
 		try {
 			$result = pg_query($this->db,"BEGIN;");
@@ -380,4 +417,5 @@
 						$description_from_DB = $row[3];
 						$found_cal_id = true;
+						if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Achou o evento na tabela phpgw_cal, vai ATUALIZAR essa tabela');
 					}
 				}
@@ -388,4 +426,5 @@
 					if(isset($row[0])) {
 						$found_cal_user = true;
+						if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Achou o evento na tabela phpgw_cal_user, vai ATUALIZAR essa tabela');
 					}
 				}
@@ -396,4 +435,5 @@
 					if(isset($row[0])) {
 						$found_cal_repeats = true;
+						if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Achou o evento na tabela phpgw_cal_repeats, vai ATUALIZAR essa tabela');
 					}
 				}
@@ -403,23 +443,30 @@
 			if(isset($message->uid)) {
 				$arrayCal["uid"] = $this->truncateString(utf8_decode($message->uid),255);
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> uid: '.$arrayCal["uid"]);
 			}
 			if(isset($message->subject)) {
 				$arrayCal["title"] = $this->truncateString(utf8_decode($message->subject),299);
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> title: '.$arrayCal["title"]);
 			}
 			if(isset($message->location)) {
 				$arrayCal["location"] = $this->truncateString(utf8_decode($message->location),255);
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> location: '.$arrayCal["location"]);
 			}
 			if(isset($message->dtstamp)) {
 				$arrayCal["mdatetime"] = $message->dtstamp;
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> mdatetime: '.$arrayCal["mdatetime"]);
 			}
 			if(isset($message->starttime)) {
 				$arrayCal["datetime"] = $message->starttime;
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> datetime: '.$arrayCal["datetime"]);
 			}
 			if(isset($message->endtime)) {
 				$arrayCal["edatetime"] = $message->endtime;
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> edatetime: '.$arrayCal["edatetime"]);
 			}
 			if(isset($message->sensitivity) and $message->sensitivity == 0) {
 				$arrayCal["is_public"] = 1; // 1 - Normal
 			} else $arrayCal["is_public"] = 0; // 0 - Privado
+			if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> is_public: '.$arrayCal["is_public"]);
 
 			if(isset($message->rtf)) {
@@ -429,4 +476,5 @@
 				if ($result_loadrtf == true) $rtf_to_ascii->parse();
 				$arrayCal["description"] = $rtf_to_ascii->out;
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> description: '.$arrayCal["description"]);
 				//			} else {
 				//				$arrayCal["description"] = '';
@@ -444,4 +492,5 @@
 					}
 				}
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> category: '.$arrayCal["category"]);
 			}
 			$tz_CEL = $this->_getTZFromSyncBlob(base64_decode($message->timezone));
@@ -462,4 +511,5 @@
 				$result = pg_insert($this->db, 'phpgw_cal', $arrayCal);
 				if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Evento INSERIDO na tabela phpgw_cal com cal_id: '.$arrayCal["cal_id"]);
 			} else {
 				if (isset($cal_type_from_DB)) {
@@ -469,4 +519,5 @@
 				$result = pg_update($this->db, 'phpgw_cal', $arrayCal, array('cal_id' => $cal_id));
 				if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Evento ATUALIZADO na tabela phpgw_cal');
 			}
 
@@ -480,7 +531,9 @@
 				$result = pg_insert($this->db, 'phpgw_cal_user', $arrayCalUser);
 				if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Evento INSERIDO na tabela phpgw_cal_user com cal_id: '.$arrayCalUser["cal_id"]);
 			} else {
 				$result = pg_update($this->db, 'phpgw_cal_user', $arrayCalUser, array('cal_id' => $cal_id, 'cal_login' => $this->_uidnumber));
 				if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Evento ATUALIZADO na tabela phpgw_cal_user');
 			}
 			if (!$id) {
@@ -490,4 +543,5 @@
 			//TODO: Implementar para os tipos 3 e 6. O Expresso ainda nao suporta esses tipos :-(
 			if (isset($message->recurrence) and ($message->recurrence->type == 0 or $message->recurrence->type == 1 or $message->recurrence->type == 2 or $message->recurrence->type == 5)) {
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> O Evento é Recorrente.');
 				switch ($message->recurrence->type) {
 					case 0: //repeticao diaria
@@ -508,10 +562,13 @@
 						break;
 				}
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Recorrência-> recur_type: '.$arrayRecur["recur_type"]);
 				if (isset($message->recurrence->interval)) {
 					$arrayRecur["recur_interval"] = $message->recurrence->interval;
+					if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Recorrência-> recur_interval: '.$arrayRecur["recur_interval"]);
 				}
 				if ($message->recurrence->type == 1 or $message->recurrence->type == 3 or $message->recurrence->type == 6) {
 					if (isset($message->recurrence->dayofweek)) {
 						$arrayRecur["recur_data"] = $message->recurrence->dayofweek;
+						if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Recorrência-> recur_data: '.$arrayRecur["recur_data"]);
 						/*$day = $message->recurrence->dayofweek;
 						 $day_of_week_counter = 0;
@@ -558,4 +615,5 @@
 					$arrayRecur["recur_enddate"] = 1893283200; // Se nao tem data de termino seta para 30/12/2029
 				}
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Recorrência-> recur_enddate: '.$arrayRecur["recur_enddate"]);
 
 				// Trata excecoes da recorrencia
@@ -563,4 +621,5 @@
 					// Tem Excecoes de recorrencia do tipo Edicao
 					// Verifica se ja existe o registro do evento de excecao de recorrencia na tabela phpgw_cal
+					if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Evento tem exceção de recorrência');
 					$recur_exception_changed_ids = "";
 					$recur_exception_deleted_starttimes = "";
@@ -584,4 +643,5 @@
 									$except_description_from_DB = $row[2];
 									$found_except_cal_id = true;
+									if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Achou o evento na tabela phpgw_cal, vai ATUALIZAR a exceção da recorrência nessa tabela');
 								}
 							}
@@ -593,4 +653,5 @@
 									if(isset($row[0])) {
 										$found_except_cal_user = true;
+										if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Achou o evento na tabela phpgw_cal_user, vai ATUALIZAR a exceção da recorrência nessa tabela');
 									}
 								}
@@ -600,4 +661,5 @@
 							if(isset($message->uid)) {
 								$arrayExceptCal["uid"] = $this->truncateString(utf8_decode($message->uid),255);
+								if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Exceção De Recorrência-> uid: '.$arrayExceptCal["uid"]);
 							}
 							if(isset($recur_exception->subject)) {
@@ -606,4 +668,5 @@
 								$arrayExceptCal["title"] = $this->truncateString(utf8_decode($message->subject),299);
 							}
+							if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Exceção De Recorrência-> title: '.$arrayExceptCal["title"]);
 							if(isset($recur_exception->location)) {
 								$arrayExceptCal["location"] = $this->truncateString(utf8_decode($recur_exception->location),255);
@@ -611,4 +674,5 @@
 								$arrayExceptCal["location"] = $this->truncateString(utf8_decode($message->location),255);
 							}
+							if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Exceção De Recorrência-> location: '.$arrayExceptCal["location"]);
 							if(isset($recur_exception->dtstamp)) {
 								$arrayExceptCal["mdatetime"] = $recur_exception->dtstamp;
@@ -616,4 +680,5 @@
 								$arrayExceptCal["mdatetime"] = $message->dtstamp;
 							}
+							if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Exceção De Recorrência-> mdatetime: '.$arrayExceptCal["mdatetime"]);
 							if(isset($recur_exception->starttime)) {
 								$arrayExceptCal["datetime"] = $recur_exception->starttime;
@@ -621,4 +686,5 @@
 								$arrayExceptCal["datetime"] = $message->starttime;
 							}
+							if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Exceção De Recorrência-> datetime: '.$arrayExceptCal["datetime"]);
 							if(isset($recur_exception->endtime)) {
 								$arrayExceptCal["edatetime"] = $recur_exception->endtime;
@@ -626,4 +692,5 @@
 								$arrayExceptCal["edatetime"] = $message->endtime;
 							}
+							if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Exceção De Recorrência-> edatetime: '.$arrayExceptCal["edatetime"]);
 							if(isset($recur_exception->sensitivity) and $recur_exception->sensitivity == 0) {
 								$arrayExceptCal["is_public"] = 1; // 1 - Normal
@@ -633,4 +700,5 @@
 								$arrayExceptCal["is_public"] = 1; // 1 - Normal
 							}else $arrayExceptCal["is_public"] = 0; // 0 - Privado
+							if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Exceção De Recorrência-> is_public: '.$arrayExceptCal["is_public"]);
 							if (isset($recur_exception->body)) {
 								$arrayExceptCal["description"] = utf8_decode($recur_exception->body);
@@ -670,4 +738,5 @@
 								}
 							}
+							if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Exceção De Recorrência-> category: '.$arrayExceptCal["category"]);
 							//TODO: Converter eventos que sao alldayevent para iniciar as 0:00hs e terminar as 23:59hs. Isso porque o Expresso nao suporta alldayevents
 							//		 if(isset($message->alldayevent)) {
@@ -683,7 +752,9 @@
 								$result = pg_insert($this->db, 'phpgw_cal', $arrayExceptCal);
 								if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+								if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Evento de Exceção da Recorrência INSERIDO na tabela phpgw_cal com cal_id: '.$arrayExceptCal["cal_id"]);
 							} else {
 								$result = pg_update($this->db, 'phpgw_cal', $arrayExceptCal, array('cal_id' => $except_cal_id));
 								if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+								if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Evento de Exceção da Recorrência ATUALIZADO na tabela phpgw_cal');
 							}
 
@@ -697,7 +768,9 @@
 								$result = pg_insert($this->db, 'phpgw_cal_user', $arrayExceptCalUser);
 								if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+								if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Evento de Exceção da Recorrência INSERIDO na tabela phpgw_cal_user com cal_id: '.$arrayExceptCalUser["cal_id"]);
 							} else {
 								$result = pg_update($this->db, 'phpgw_cal_user', $arrayExceptCalUser, array('cal_id' => $except_cal_id, 'cal_login' => $this->_uidnumber));
 								if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+								if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Evento de Exceção da Recorrência ATUALIZADO na tabela phpgw_cal_user');
 							}
 							if ($recur_exception_changed_ids == "") {
@@ -717,6 +790,8 @@
 						//Tem Excecoes de recorrencia do tipo Exclusao
 						$arrayRecur["recur_exception"] = $recur_exception_deleted_starttimes;
+						if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Evento tem exceção de recorrência do tipo exclusão com os seguintes starttimes: '.$recur_exception_deleted_starttimes);
 					} else {
 						$arrayRecur["recur_exception"] = "";
+						if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Não tem exceção de recorrência do tipo exclusão para esse evento');
 					}
 					if ($recur_exception_changed_ids == "") {
@@ -726,4 +801,5 @@
 						$result = pg_query($this->db, "delete from phpgw_cal where reference = " . $cal_id . ";");
 						if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+						if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Não tem exceção de recorrência, então deleta possíveis eventos de exceção de recorrência criados anteriormente para esse evento.');
 					} else {
 						//Deleta as excecoes da recorrencia, exceto as inseridas/atualizadas acima
@@ -732,4 +808,5 @@
 						$result = pg_query($this->db, "delete from phpgw_cal where reference = " . $cal_id . " and cal_id not in (" . $recur_exception_changed_ids . ");");
 						if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+						if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Deleta as exçeções da recorrência, exceto as inseridas/atualizadas pelo celular com os seguintes cal_id:'.$recur_exception_changed_ids);
 					}
 				} else {
@@ -740,5 +817,5 @@
 					$result = pg_query($this->db, "delete from phpgw_cal where reference = " . $cal_id . ";");
 					if ($result == FALSE) throw new Exception(pg_last_error($this->db));
-
+					if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Não tem exceção de recorrência, então deleta possíveis eventos de exceção de recorrência criados anteriormente para esse evento..');
 				}
 				if (!$found_cal_repeats){
@@ -746,7 +823,9 @@
 					$result = pg_insert($this->db, 'phpgw_cal_repeats', $arrayRecur);
 					if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+					if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Recorrência INSERIDA na tabela phpgw_cal_repeats com cal_id: '.$arrayRecur["cal_id"]);
 				} else {
 					$result = pg_update($this->db, 'phpgw_cal_repeats', $arrayRecur, array('cal_id' => $cal_id));
 					if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+					if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Recorrência ATUALIZADA na tabela phpgw_cal_repeats');
 				}
 			} elseif ($found_cal_id) {
@@ -758,4 +837,5 @@
 				$result = pg_query($this->db, "delete from phpgw_cal_repeats where cal_id = " . $cal_id . ";");
 				if ($result == FALSE) throw new Exception(pg_last_error($this->db));
+				if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Não tem recorrência, então deleta possíveis eventos de recorrência criados anteriormente para esse evento');
 			}
 			$result = pg_query($this->db,"COMMIT;");
@@ -767,4 +847,5 @@
 			return false;
 		}
+		if (TRACE_UID !== false and (TRACE_TYPE == 'CALENDAR' or TRACE_TYPE == 'ALL')) traceLog('CalendarExpresso::ChangeMessageDAO-> Fim normal da Função');
 		return $id;
 	}
