Index: sandbox/2.4.2-expresso1/prototype/services/iCal.php
===================================================================
--- sandbox/2.4.2-expresso1/prototype/services/iCal.php	(revision 6528)
+++ sandbox/2.4.2-expresso1/prototype/services/iCal.php	(revision 6891)
@@ -122,4 +122,78 @@
 		    break;
 
+        case TASK_ID:
+
+            $todo = $ical->newComponent('todo');
+
+            $todo->setProperty('summary', $v['summary']);
+            $todo->setProperty('description', isset($v['description']) ? $v['description'] : '');
+            $todo->setProperty('priority', $v['priority']);
+            $todo->setProperty('percent-complete', $v['percentage']);
+            $todo->setProperty('status', $this->_getStatusTodo($v['status']));
+
+            $timezone = new DateTimeZone('UTC');
+            $apTimezone = self::nomalizeTZID(( isset($v['timezone']) && $v['timezone'] != 'null' ) ? $v['timezone'] : $params['defaultTZI']);
+            $apTimezoneOBJ = new DateTimeZone($apTimezone);
+
+            $sTime = new DateTime('@' . (int) ($v['startTime'] / 1000), $timezone);
+            $sTime->setTimezone($apTimezoneOBJ);
+            $eTime = new DateTime('@' . (int) ($v['endTime'] / 1000), $timezone);
+            $eTime->setTimezone($apTimezoneOBJ);
+
+            if (isset($v['allDay']) && $v['allDay'] == 1) {
+                $todo->setProperty('dtstart', $sTime->format(DATE_RFC822), array("VALUE" => "DATE"));
+                $todo->setProperty('dtend', $eTime->format(DATE_RFC822), array("VALUE" => "DATE"));
+                //$todo->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'TRUE');
+            } else {
+                $todo->setProperty('dtstart', $sTime->format(DATE_RFC822), array('TZID' => $apTimezone));
+                $todo->setProperty('dtend', $eTime->format(DATE_RFC822), array('TZID' => $apTimezone));
+                //$todo->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'FALSE');
+            }
+
+            if(isset($v['due']) && $v['due'] != ''){
+                $dueTime = new DateTime('@' . (int) ($v['due'] / 1000), $timezone);
+                $dueTime->setTimezone($apTimezoneOBJ);
+
+                $todo->setProperty('due', $dueTime->format(DATE_RFC822), array('TZID' => $apTimezone));
+            }
+            
+            $todo->setProperty('due', $dueTime->format(DATE_RFC822), array('TZID' => $apTimezone));
+                   
+            if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0)
+                $participants = $v['participants'];
+            else
+                $participants = Controller::find(array('concept' => 'participant'), false, array('filter' => array('=', 'schedulable', $v['id'])));
+            
+            if (is_array($participants) && count($participants) > 0)
+                foreach ($participants as $ii => $vv) {
+                
+                    if(isset($participants[$ii]['user']) && !is_array($participants[$ii]['user']))
+                    {
+                        if ($vv['isExternal'] == 1)
+                            $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'], 'service' => 'PostgreSQL'));
+                        else
+                            $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user']));
+                    }
+                
+                    if ($participants[$ii]['user']['id'] == Config::me('uidNumber'))
+                    {
+                        $alarms = (isset($participants[$ii]['alarms'])) ? $participants[$ii]['alarms'] : Controller::find(array('concept' => 'alarm'), null, array('filter' => array('AND', array('=', 'participant', $vv['id']), array('=', 'schedulable', $v['id']))));
+                        if(is_array($alarms))
+                            self::createAlarms($alarms, $todo);
+                    }
+                
+                }
+            
+
+            if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0)
+                $this->createAttendee($v['participants'], $todo);
+
+            if (isset($v['attachments']) && is_array($v['attachments']) && count($v['attachments']) > 0)
+                $this->createAttachment($v['attachments'], $todo);
+
+            $todo->setProperty('uid', $v['uid']);  
+            
+            break;
+
 		default:
 		    break;
@@ -219,5 +293,5 @@
 
     public function parse($data, $params = false) {
-	Config::regSet('noAlarm', TRUE); //Evita o envio de notificação
+	Config::regSet('noAlarm', TRUE); //Evita o envio de notificaÃ§Ã£o
 	$vcalendar = new icalCreator( );
 	$vcalendar->parse(trim($data));
@@ -232,4 +306,10 @@
 	    $interation = array();
 	    $uid = $component->getProperty('uid', false, false); //Resgata o uid do componente
+	    
+	    ob_start();
+	    print_r(strtoupper($component->objName));
+	    $output = ob_get_clean();
+	    file_put_contents( "/tmp/acoutinho.log",  $output , FILE_APPEND);
+	
 
 	    switch (strtoupper($component->objName)) {
@@ -238,5 +318,5 @@
 		    switch ($method) {
 			case 'PUBLISH':
-			    //Caso o evento não exista o mesmo cria um novo evento, se já existir o mesmo referencia o evento com agenda
+			    //Caso o evento nÃ£o exista o mesmo cria um novo evento, se jÃ¡ existir o mesmo referencia o evento com agenda
                             if (!$schedulable = self::_getSchedulable($uid))
 				$interation = self::_makeVEVENT($schedulable, $component, $params);
@@ -273,12 +353,12 @@
 				    }
 
-				    Config::regSet('noAlarm', FALSE); //reativa notificação
+				    Config::regSet('noAlarm', FALSE); //reativa notificaÃ§Ã£o
 				} else {
 
-				    if (self::_getTime($component, 'dtstamp') > $schedulable['dtstamp'] || $component->getProperty('sequence', false, false) > $schedulable['sequence']) //Organizador esta requisitando que você atualize o evento
+				    if (self::_getTime($component, 'dtstamp') > $schedulable['dtstamp'] || $component->getProperty('sequence', false, false) > $schedulable['sequence']) //Organizador esta requisitando que vocÃª atualize o evento
 					$interation = self::_makeVEVENT($schedulable, $component, $params);
 				    else if ($component->getProperty('sequence', false, false) === $schedulable['sequence']) {
 					//Ler melhor rfc sobre isto 3.2.2.2
-					//Aparentemente é para retornar um ical com o evento atualizado para o attende
+					//Aparentemente Ã© para retornar um ical com o evento atualizado para o attende
 				    }
 
@@ -289,5 +369,5 @@
 					}else
 					    $pID = self::_getParticipantByMail(Config::me('mail'), $schedulable['participants']);
-					//Verifica a importação de eventos em que não participo
+					//Verifica a importaÃ§Ã£o de eventos em que nÃ£o participo
 					if ($pID) {
 					    $interation['participant://' . $pID]['status'] = $params['status'];
@@ -298,5 +378,5 @@
 				$interation = self::_makeVEVENT(array(), $component, $params);
 
-				if (strpos($params['prodid'], 'kigkonsult.se') !== false) { //envia notificação para fora
+				if (strpos($params['prodid'], 'kigkonsult.se') !== false) { //envia notificaÃ§Ã£o para fora
 
 				    /* Data de Inicio */
@@ -316,13 +396,13 @@
 					$sc['allDay'] = 1;
 					$sc['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $sc['timezone']) . '000';
-				    } elseif (isset($startTime['params']['TZID']) && !isset($startTime['value']['tz']))/* Caso não tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
+				    } elseif (isset($startTime['params']['TZID']) && !isset($startTime['value']['tz']))/* Caso nÃ£o tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
 					$sc['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $startTime['params']['TZID']) . '000';
 				    else {
 					$sc['startTime'] = self::date2timestamp($startTime['value']) . '000';
 					if (strpos($params['prodid'], 'Outlook') !== false) {
-					    //Se o ics veio em utc não aplicar horario de verão
+					    //Se o ics veio em utc nÃ£o aplicar horario de verÃ£o
 					    $sTime = new DateTime('@' . (int) ($sc['startTime'] / 1000), new DateTimeZone('UTC'));
 					    $sTime->setTimezone($objTimezone);
-					    if ($sTime->format('I')) //Se o ics veio em utc não aplicar horario de verão
+					    if ($sTime->format('I')) //Se o ics veio em utc nÃ£o aplicar horario de verÃ£o
 						$sc['startTime'] = $sc['startTime'] - 3600000;
 					}
@@ -335,10 +415,10 @@
 				    if (isset($endTime['params']['VALUE']) && $endTime['params']['VALUE'] === 'DATE')
 					$sc['endTime'] = self::date2timestamp($endTime['value']) - self::_getTzOffset('UTC', $sc['timezone']) . '000';
-				    else if (isset($endTime['params']['TZID']) && !isset($endTime['value']['tz'])) /* Caso não tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
+				    else if (isset($endTime['params']['TZID']) && !isset($endTime['value']['tz'])) /* Caso nÃ£o tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
 					$sc['endTime'] = self::date2timestamp($endTime['value']) - self::_getTzOffset('UTC', $endTime['params']['TZID']) . '000';
 				    else {
 					$sc['endTime'] = self::date2timestamp($endTime['value']) . '000';
 					if (strpos($params['prodid'], 'Outlook') !== false) {
-					    //Se o ics veio em utc não aplicar horario de verão
+					    //Se o ics veio em utc nÃ£o aplicar horario de verÃ£o
 					    $eTime = new DateTime('@' . (int) ($sc['endTime'] / 1000), new DateTimeZone('UTC'));
 					    $eTime->setTimezone($objTimezone);
@@ -527,7 +607,4 @@
 			    else // Importar evento
 				$interation = self::_makeVEVENT(array(), $component, $params);
-
-
-
 			    break;
 		    }
@@ -536,8 +613,315 @@
 		    $return[] = $interation;
 		    break;
-		case 'VTIMEZONE':
-
-
-		    break;
+		/***********************************************************************TODO*******************************************************************************/
+        case 'VTODO':
+        switch ($method) {
+            case 'PUBLISH':
+                //Caso a tarefa nÃ£o exista o mesmo cria um novo evento, se jÃ¡ existir o mesmo referencia o evento com agenda
+                if (!$schedulable = self::_getSchedulable($uid))
+                    $interation = self::_makeVEVENT($schedulable, $component, $params);
+                else{
+                    $links = Controller::read(array('concept' => 'calendarToSchedulable'), array('id'), array('filter' =>
+                    array('AND',
+                        array('=', 'calendar', $params['calendar']),
+                        array('=', 'schedulable', $schedulable['id'])
+                    )));
+
+                    if(!$links &&  !isset($links[0]))
+                        Controller::create(array('concept' => 'calendarToSchedulable'), array('calendar' => $params['calendar'], 'schedulable' => $schedulable['id']));
+                }
+                break;
+
+            case 'REQUEST':
+                $schedulable = self::_getSchedulable($uid);
+
+                if ($schedulable) { //Caso tarefa exista
+                    if (!self::_existInMyCalendars($schedulable['id'], $params['owner'])) {
+                        
+                        $calendarToSchedulable = array();
+                        $calendarToSchedulable['calendar'] = $params['calendar'];
+                        $calendarToSchedulable['schedulable'] = $schedulable['id'];
+                        $interation['calendarToSchedulable://' . mt_rand() . '(Formatter)'] = $calendarToSchedulable;
+        
+                        if (isset($params['status'])) {
+                            if($params['owner'] != Config::me("uidNumber")){                        
+                                $user = Controller::Read(array('concept' => 'user'), false, array('filter' => array('=', 'id', $params['owner'])) );                        
+                                $pID = self::_getParticipantByMail($user[0]['mail'], $schedulable['participants']);
+                            }else
+                                $pID = self::_getParticipantByMail(Config::me('mail'), $schedulable['participants']);
+                                $interation['participant://' . $pID]['status'] = $params['status'];
+                        }
+                        Config::regSet('noAlarm', FALSE); //reativa notificaÃ§Ã£o
+                    } else {
+
+                        if (self::_getTime($component, 'dtstamp') > $schedulable['dtstamp'] || $component->getProperty('sequence', false, false) > $schedulable['sequence']) //Organizador esta requisitando que vocÃª atualize o evento
+                            $interation = self::_makeVEVENT($schedulable, $component, $params);
+                        else if ($component->getProperty('sequence', false, false) === $schedulable['sequence']) {
+                        //Ler melhor rfc sobre isto 3.2.2.2
+                        //Aparentemente Ã© para retornar um ical com o evento atualizado para o attende
+                        }
+
+                        if (isset($params['status'])) {
+                            if($params['owner'] != Config::me("uidNumber")){                        
+                               $user = Controller::Read(array('concept' => 'user'), false, array('filter' => array('=', 'id', $params['owner'])) );                     
+                                $pID = self::_getParticipantByMail($user[0]['mail'], $schedulable['participants']);
+                            }else
+                                $pID = self::_getParticipantByMail(Config::me('mail'), $schedulable['participants']);
+                            //Verifica a importaÃ§Ã£o de eventos em que nÃ£o participo
+                            if ($pID) {
+                                $interation['participant://' . $pID]['status'] = $params['status'];
+                            }
+                        }
+                    }
+		} else { // Importar tarefa
+		    $interation = self::_makeVEVENT(array(), $component, $params);
+
+		    if (strpos($params['prodid'], 'kigkonsult.se') !== false) { //envia notificaÃ§Ã£o para fora
+
+			/* Data de Inicio */
+			$startTime = $component->getProperty('dtstart', false, true);
+			$tzid = isset($startTime['params']['TZID']) ? $startTime['params']['TZID'] : $params['X-WR-TIMEZONE'];
+
+			/* Tiem zone do evento */   
+			if ($tzid)
+			    $sc['timezone'] = self::nomalizeTZID($tzid);
+			else
+			    $sc['timezone'] = isset($params['calendar_timezone']) ? $params['calendar_timezone'] : 'America/Sao_Paulo';
+
+			$objTimezone = new DateTimeZone($sc['timezone']);
+
+			if (isset($startTime['params']['VALUE']) && $startTime['params']['VALUE'] === 'DATE' && isset($params['calendar_timezone'])) {
+			    $sc['allDay'] = 1;
+			    $sc['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $sc['timezone']) . '000';
+			} elseif (isset($startTime['params']['TZID']) && !isset($startTime['value']['tz']))/* Caso nÃ£o tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
+			    $sc['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $startTime['params']['TZID']) . '000';
+			else {
+			    $sc['startTime'] = self::date2timestamp($startTime['value']) . '000';
+			    if (strpos($params['prodid'], 'Outlook') !== false) {
+				//Se o ics veio em utc nÃ£o aplicar horario de verÃ£o
+				$sTime = new DateTime('@' . (int) ($sc['startTime'] / 1000), new DateTimeZone('UTC'));
+				$sTime->setTimezone($objTimezone);
+				if ($sTime->format('I')) //Se o ics veio em utc nÃ£o aplicar horario de verÃ£o
+				$sc['startTime'] = $sc['startTime'] - 3600000;
+			    }
+			}
+
+			/* Data de Termino */
+			$endTime = $component->getProperty('dtend', false, true);
+
+			if (isset($endTime['params']['VALUE']) && $endTime['params']['VALUE'] === 'DATE')
+			    $sc['endTime'] = self::date2timestamp($endTime['value']) - self::_getTzOffset('UTC', $sc['timezone']) . '000';
+			else if (isset($endTime['params']['TZID']) && !isset($endTime['value']['tz'])) /* Caso nÃ£o tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
+			    $sc['endTime'] = self::date2timestamp($endTime['value']) - self::_getTzOffset('UTC', $endTime['params']['TZID']) . '000';
+			else {
+			    $sc['endTime'] = self::date2timestamp($endTime['value']) . '000';
+			    if (strpos($params['prodid'], 'Outlook') !== false) {
+				//Se o ics veio em utc nÃ£o aplicar horario de verÃ£o
+				$eTime = new DateTime('@' . (int) ($sc['endTime'] / 1000), new DateTimeZone('UTC'));
+				$eTime->setTimezone($objTimezone);
+				if ($eTime->format('I'))
+				    $sc['endTime'] = $sc['endTime'] - 3600000;
+			    }
+			}
+
+
+			if ($uid = $component->getProperty('uid', false, false))                    
+			    $sc['uid'] = $uid;
+
+			$sc['summary'] = mb_convert_encoding($component->getProperty('summary', false, false), 'UTF-8', 'UTF-8,ISO-8859-1');
+
+			/* Definindo Description */
+			if ($desc = $component->getProperty('description', false, false))
+			    $sc['description'] = mb_convert_encoding(str_ireplace(array('\n', '\t'), array("\n", "\t"), $desc), 'UTF-8', 'UTF-8,ISO-8859-1');
+
+            if ($priority = $component->getProperty('priority', false, false))
+                $sc['priority'] = mb_convert_encoding(str_ireplace(array('\n', '\t'), array("\n", "\t"), $priority), 'UTF-8', 'UTF-8,ISO-8859-1');
+
+            if ($status = $component->getProperty('status', false, false))
+                $sc['status'] = $this->decodeStatusTodo(mb_convert_encoding(str_ireplace(array('\n', '\t'), array("\n", "\t"), $status), 'UTF-8', 'UTF-8,ISO-8859-1'));
+
+            if ($percentage = $component->getProperty('percent-complete', false, false))
+                $sc['percentage'] = mb_convert_encoding(str_ireplace(array('\n', '\t'), array("\n", "\t"), $percentage), 'UTF-8', 'UTF-8,ISO-8859-1');
+
+            $todo->setProperty('priority', $v['priority']);
+            $todo->setProperty('percent-complete', $v['percentage']);
+            $todo->setProperty('status', $this->_getStatusTodo($v['status']));
+
+			/* Definindo location */
+			if ($location = $component->getProperty('location', false, false))
+			    $sc['location'] = mb_convert_encoding($location, 'UTF-8', 'UTF-8,ISO-8859-1');
+
+
+
+			if ($property = $component->getProperty('organizer', FALSE, TRUE)) {
+			    $participant = array();
+			    $mailUser = trim(str_replace('MAILTO:', '', $property['value']));
+
+			    $participantID = mt_rand() . '2(Formatter)';
+
+			    $participant['isOrganizer'] = '1';
+
+			    $user = null;
+
+			    $participant['isExternal'] = 1;
+			    /* Gera um randon id para o contexto formater */
+			    $userID = mt_rand() . '4(Formatter)';
+
+			    $user['mail'] = $mailUser;
+			    $organizerMail = $mailUser;
+
+			    $user['name'] = ( isset($property['params']['CN']) ) ? $property['params']['CN'] : '';
+			    $user['isExternal'] = '1';
+			    $participant['user'] = $user;
+
+			    $sc['participants'][] = $participant;
+			}
+
+
+			$participant['status'] = isset($params['status']) ? $params['status'] : STATUS_ACCEPTED;
+			$participant['isOrganizer'] = '0';
+			$participant['isExternal'] = 0;
+			$participant['user'] = array('mail' => Config::me('mail'), 'name' => Config::me('cn'));
+			$sc['participants'][] = $participant;
+			$sc['type'] = TODO_ID;
+
+
+			$ical['source'] = Controller::format(array('service' => 'iCal'), array($sc), array('method' => 'REPLY'));
+			$ical['type'] = 'application/ics';
+			$ical['name'] = 'outlook.ics';
+
+			$ical2['source'] = $ical['source'];
+			$ical2['type'] = 'text/calendar; method=REPLY';
+			$ical2['name'] = 'thunderbird.ics';
+
+			$timezone = new DateTimeZone('UTC');
+			$sTime = new DateTime('@' . (int) ($sc['startTime'] / 1000), $timezone);
+			$eTime = new DateTime('@' . (int) ($sc['endTime'] / 1000), $timezone);
+
+			if (isset($sc['timezone'])) {
+			    $sTime->setTimezone(new DateTimeZone($sc['timezone']));
+			    $eTime->setTimezone(new DateTimeZone($sc['timezone']));
+			}
+
+			$data = array('startDate' => date_format($sTime, 'd/m/Y'),
+			'startTime' => (isset($sc['allDay']) && $sc['allDay'] ) ? '' : date_format($sTime, 'H:i'),
+			'endDate' => date_format($eTime, 'd/m/Y'),
+			'endTime' => isset($sc['allDay']) ? '' : date_format($eTime, 'H:i'),
+			'eventTitle' => $sc['summary'],
+			'eventLocation' => isset($sc['location']) ? $sc['location'] : '',
+			'timezone' => ($sc['timezone']) ? $sc['timezone'] : 'UTC',
+			'participant' => (isset($part['user']['name']) ? $part['user']['name'] : $part['user']['mail']));
+
+			$subject['notificationType'] = 'Convite Aceito';
+			$subject['eventTitle'] = mb_convert_encoding($sc['summary'], 'ISO-8859-1', 'ISO-8859-1,UTF-8');
+			$subject['startDate'] = date_format($sTime, 'd/m/Y');
+			$subject['startTime'] = ($sc['allDay']) ? '' : date_format($sTime, 'H:i');
+			$subject['endDate'] = date_format($eTime, 'd/m/Y');
+			$subject['endTime'] = ($sc['allDay']) ? '' : date_format($eTime, 'H:i');
+			$subject['participant'] = Config::me('uid');
+
+			$params['status'] = isset($params['status']) ? $params['status'] : STATUS_ACCEPTED;
+
+			switch ($params['status']) {
+			    case STATUS_ACCEPTED:
+				$tpl = 'notify_accept_body';
+				$subject['notificationType'] = 'Convite Aceito';
+				break;
+			    case STATUS_TENTATIVE:
+				$tpl = 'notify_attempt_body';
+				$subject['notificationType'] = 'Convite  aceito provisoriamente';
+				break;
+			    case STATUS_CANCELLED:
+				$tpl = 'notify_reject_body';
+				$subject['notificationType'] = 'Convite rejeitado';
+				break;
+			}
+
+			require_once ROOTPATH . '/api/parseTPL.php';
+
+			$mail = array();
+			$mail['attachments'][] = $ical;
+			$mail['attachments'][] = $ical2;
+
+			$mail['isHtml'] = true;
+			$mail['body'] = parseTPL::load_tpl($data, ROOTPATH . '/modules/calendar/templates/' . $tpl . '.tpl');
+			$mail['subject'] = parseTPL::load_tpl($subject, ROOTPATH . '/modules/calendar/templates/notify_subject.tpl');
+
+			$mail['from'] = '"' . Config::me('cn') . '" <' . Config::me('mail') . '>';
+			$mail['to'] = $organizerMail;
+
+
+			Controller::create(array('service' => 'SMTP'), $mail);
+		    }
+                }
+                break;
+
+            case 'REFRESH':
+                break;
+
+            case 'CANCEL':
+                if ($schedulable = self::_getSchedulable($uid))
+		    $interation['schedulable://' . $schedulable['id']] = false;
+                break;
+
+            case 'ADD':
+                break;
+
+            case 'REPLY':
+                if ($schedulable = self::_getSchedulable($uid)) {
+		    while ($property = $component->getProperty('attendee', FALSE, TRUE))
+			if ($pID = self::_getParticipantByMail(str_replace('MAILTO:', '', $property['value']), $schedulable['participants']))
+			    $interation['participant://' . $pID] = array('id' => $pID, 'status' => constant('STATUS_' . strtoupper($property['params']['PARTSTAT'])));
+
+		    $interation['schedulable://' . $schedulable['id']]['sequence'] = $schedulable['sequence'] + 1;
+                }
+                break;
+
+            case 'COUNTER':
+                if ($params['acceptedSuggestion'] !== 'false') {
+
+		    $schedulable = self::_getSchedulable($uid);
+		    $params['calendar'] = self::_existInMyCalendars($schedulable['id'], $params['owner']);
+
+		    $interation = self::_makeCOUNTER($schedulable, $component, $params);
+		    Config::regSet('noAlarm', FALSE);
+                } else {
+		    $response = array();
+		    $response['from'] = $params['from'];
+		    $response['type'] = 'suggestionResponse';
+		    $response['status'] = 'DECLINECOUNTER';
+		    $response['schedulable'] = self::_getSchedulable($uid);
+
+		    Controller::create(array('concept' => 'notification'), $response);
+                }
+                break;
+
+            case 'DECLINECOUNTER':
+                break;
+
+            default:
+
+                $schedulable = self::_getSchedulable($uid);
+
+                if ($schedulable && ( self::_getTime($component, 'dtstamp') > $schedulable['dtstamp'] || $component->getProperty('sequence', false, false) > $schedulable['sequence'])) { //Caso o evento exista
+		    $interation = self::_makeVEVENT($schedulable, $component, $params);
+
+		    if (!self::_existInMyCalendars($schedulable['id'], $params['owner'])) {
+			$calendarToSchedulable = array();
+			$calendarToSchedulable['calendar'] = $params['calendar'];
+			$calendarToSchedulable['schedulable'] = $schedulable['id'];
+			$interation['calendarToSchedulable://' . mt_rand() . '(Formatter)'] = $calendarToSchedulable;
+		    }
+                }
+                else // Importar evento
+                $interation = self::_makeVEVENT(array(), $component, $params);
+
+                break;
+            }
+    
+            $return[] = $interation;
+        break;
+        /***********************************************************************TODO*******************************************************************************/
+        case 'VTIMEZONE':
+		break;
 	    }
 	}
@@ -556,5 +940,4 @@
 	    $interation = array();
 	    $uid = $component->getProperty('uid', false, false); //Resgata o uid do componente
-
 	    switch (strtoupper($component->objName)) {
 		case 'VEVENT':
@@ -583,5 +966,5 @@
 					}
 				    } else {
-					if (self::_getTime($component, 'dtstamp') > $schedulable['dtstamp'] || $component->getProperty('sequence', false, false) > $schedulable['sequence']) //Organizador esta requisitando que você atualize o evento
+					if (self::_getTime($component, 'dtstamp') > $schedulable['dtstamp'] || $component->getProperty('sequence', false, false) > $schedulable['sequence']) //Organizador esta requisitando que vocÃª atualize o evento
 					    $interation = ($isOrganizer) ? ICAL_ACTION_ORGANIZER_UPDATE : ICAL_ACTION_UPDATE;
 					else
@@ -649,8 +1032,86 @@
 		    $return[$uid] = $interation;
 		    break;
+		case 'VTODO':
+		    switch ($method) {
+			case 'PUBLISH':
+			    $interation = ICAL_ACTION_IMPORT;
+			    break;
+
+			case 'REQUEST':
+			    $schedulable = self::_getSchedulable($uid);
+			   
+			    if ($schedulable) { //Caso o evento exista
+				$isOrganizer = false;
+				$isParticipant = false;
+
+				foreach ($schedulable['participants'] as $value)
+				    if ($value['user']['id'] == $params['owner']) {
+					$isParticipant = true;
+					if ($value['isOrganizer'])
+					    $isOrganizer = true;
+
+					if (!self::_existInMyCalendars($schedulable['id'], $params['owner'])) {
+					    
+					    ob_start();
+					    print_r($schedulable['id']);
+					    print_r( $params['owner']);
+					    $output = ob_get_clean();
+					    file_put_contents( "/tmp/acoutinho.log",  $output , FILE_APPEND);
+					    
+					    $interation = ICAL_ACTION_IMPORT;
+					    break;
+					}
+				    } else {
+					if (self::_getTime($component, 'dtstamp') > $schedulable['dtstamp'] || $component->getProperty('sequence', false, false) > $schedulable['sequence']) //Organizador esta requisitando que vocÃª atualize o evento
+					    $interation = ($isOrganizer) ? ICAL_ACTION_ORGANIZER_UPDATE : ICAL_ACTION_UPDATE;
+					else
+					    $interation = ($isOrganizer) ? ICAL_ACTION_ORGANIZER_NONE : ICAL_ACTION_NONE;
+				    }
+				if (!$isParticipant){
+				      $interation = self::_checkParticipantByPermissions($schedulable);
+				    }
+			    }else
+				$interation = ICAL_ACTION_IMPORT;
+			    break;
+
+			case 'REFRESH':
+			    break;
+
+			case 'CANCEL':
+			    $interation = ICAL_ACTION_DELETE;
+			    break;
+
+			case 'ADD':
+			    break;
+
+			case 'REPLY':
+			    $interation = ICAL_ACTION_REPLY;
+			    break;
+
+			case 'COUNTER':
+			    $interation = ICAL_ACTION_SUGGESTION;
+			    break;
+
+			case 'DECLINECOUNTER':
+			    $interation = ICAL_ACTION_NONE;
+			    break;
+
+			default:
+			    $schedulable = self::_getSchedulable($uid);
+
+			    if ($schedulable && ( self::_getTime($component, 'dtstamp') > $schedulable['dtstamp'] || $component->getProperty('sequence', false, false) > $schedulable['sequence'])) //Caso o evento exista
+				$interation = ICAL_ACTION_UPDATE;
+			    else if ($schedulable)
+				$interation = ICAL_ACTION_NONE;
+			    else // Importar evento
+				$interation = ICAL_ACTION_IMPORT;
+
+			    break;
+		    }
+
+		    $return[$uid] = $interation;
+		    break;
 		case 'VTIMEZONE':
-
-
-		    break;
+		break;
 	    }
 	}
@@ -690,4 +1151,29 @@
     }
 
+    public function decodeStatusTodo( $action )
+    {
+     $a = array(
+        'NEED_ACTION' => STATUS_TODO_NEED_ACTION,
+        'IN_PROGRESS' => STATUS_TODO_IN_PROGRESS  ,
+        'COMPLETED' =>  STATUS_TODO_COMPLETED ,
+        'CANCELLED'  => STATUS_TODO_CANCELLED
+    );
+
+    return isset($a[$id]) ? $a[$id] : 'STATUS_TODO_NEED_ACTION';
+    
+    }
+
+
+    private function _getStatusTodo($id) {
+        $a = array(
+            STATUS_TODO_NEED_ACTION => 'NEED_ACTION',
+            STATUS_TODO_IN_PROGRESS => 'IN_PROGRESS',
+            STATUS_TODO_COMPLETED => 'COMPLETED',
+            STATUS_TODO_CANCELLED => 'CANCELLED'
+        );
+
+    return isset($a[$id]) ? $a[$id] : 'NEED_ACTION';
+    }
+
     private static function _checkParticipantByPermissions($schedulable) {
 
@@ -768,5 +1254,5 @@
 	    $schedulable['allDay'] = 1;
 	    $schedulable['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $schedulable['timezone'], '@' . self::date2timestamp($startTime['value'])) . '000';
-	} elseif (isset($startTime['params']['TZID']) && !isset($startTime['value']['tz'])) {/* Caso não tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
+	} elseif (isset($startTime['params']['TZID']) && !isset($startTime['value']['tz'])) {/* Caso nÃ£o tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
 	    $schedulable['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $startTime['params']['TZID'], '@' . self::date2timestamp($startTime['value'])) . '000';
 	    $schedulable['allDay'] = 0;
@@ -774,8 +1260,8 @@
 	    $schedulable['startTime'] = self::date2timestamp($startTime['value']) . '000';
 	    if (strpos($params['prodid'], 'Outlook') !== false) {
-		//Se o ics veio em utc não aplicar horario de verão
+		//Se o ics veio em utc nÃ£o aplicar horario de verÃ£o
 		$sTime = new DateTime('@' . (int) ($schedulable['startTime'] / 1000), new DateTimeZone('UTC'));
 		$sTime->setTimezone($objTimezone);
-		if ($sTime->format('I')) //Se o ics veio em utc não aplicar horario de verão
+		if ($sTime->format('I')) //Se o ics veio em utc nÃ£o aplicar horario de verÃ£o
 		    $schedulable['startTime'] = $schedulable['startTime'] - 3600000;
 	    }
@@ -787,10 +1273,10 @@
 	if ($endTime['params']['VALUE'] === 'DATE')
 	    $schedulable['endTime'] = self::date2timestamp($endTime['value']) - self::_getTzOffset('UTC', $schedulable['timezone'], '@' . self::date2timestamp($endTime['value'])) . '000';
-	else if (isset($endTime['params']['TZID']) && !isset($endTime['value']['tz'])) /* Caso não tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
+	else if (isset($endTime['params']['TZID']) && !isset($endTime['value']['tz'])) /* Caso nÃ£o tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
 	    $schedulable['endTime'] = self::date2timestamp($endTime['value']) - self::_getTzOffset('UTC', $endTime['params']['TZID'], '@' . self::date2timestamp($endTime['value'])) . '000';
 	else {
 	    $schedulable['endTime'] = self::date2timestamp($endTime['value']) . '000';
 	    if (strpos($params['prodid'], 'Outlook') !== false) {
-		//Se o ics veio em utc não aplicar horario de verão
+		//Se o ics veio em utc nÃ£o aplicar horario de verÃ£o
 		$eTime = new DateTime('@' . (int) ($schedulable['endTime'] / 1000), new DateTimeZone('UTC'));
 		$eTime->setTimezone($objTimezone);
@@ -826,5 +1312,5 @@
 	    $schedulable['allDay'] = 1;
 	    $schedulable['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $schedulable['timezone'], '@' . self::date2timestamp($startTime['value'])) . '000';
-	} elseif ($tzid && !isset($startTime['value']['tz'])) {/* Caso não tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
+	} elseif ($tzid && !isset($startTime['value']['tz'])) {/* Caso nÃ£o tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
 	    $schedulable['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $tzid, '@' . self::date2timestamp($startTime['value'])) . '000';
 	    $schedulable['allDay'] = 0;
@@ -832,8 +1318,8 @@
 	    $schedulable['startTime'] = self::date2timestamp($startTime['value']) . '000';
 	    if (strpos($params['prodid'], 'Outlook') !== false) {
-		//Se o ics veio em utc não aplicar horario de verão
+		//Se o ics veio em utc nÃ£o aplicar horario de verÃ£o
 		$sTime = new DateTime('@' . (int) ($schedulable['startTime'] / 1000), new DateTimeZone('UTC'));
 		$sTime->setTimezone($objTimezone);
-		if ($sTime->format('I')) //Se o ics veio em utc não aplicar horario de verão
+		if ($sTime->format('I')) //Se o ics veio em utc nÃ£o aplicar horario de verÃ£o
 		    $schedulable['startTime'] = $schedulable['startTime'] - 3600000;
 	    }
@@ -850,10 +1336,10 @@
 	if (isset($endTime['params']['VALUE']) && $endTime['params']['VALUE'] === 'DATE')
 	    $schedulable['endTime'] = self::date2timestamp($endTime['value']) - self::_getTzOffset('UTC', $schedulable['timezone'], '@' . self::date2timestamp($endTime['value'])) . '000';
-	else if ($tzid && !isset($endTime['value']['tz'])) /* Caso não tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
+	else if ($tzid && !isset($endTime['value']['tz'])) /* Caso nÃ£o tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */
 	    $schedulable['endTime'] = self::date2timestamp($endTime['value']) - self::_getTzOffset('UTC', $tzid, '@' . self::date2timestamp($endTime['value'])) . '000';
 	else {
 	    $schedulable['endTime'] = self::date2timestamp($endTime['value']) . '000';
 	    if (strpos($params['prodid'], 'Outlook') !== false) {
-		//Se o ics veio em utc não aplicar horario de verão
+		//Se o ics veio em utc nÃ£o aplicar horario de verÃ£o
 		$eTime = new DateTime('@' . (int) ($schedulable['endTime'] / 1000), new DateTimeZone('UTC'));
 		$eTime->setTimezone($objTimezone);
@@ -880,5 +1366,5 @@
 	    $schedulable['class'] = constant(strtoupper('CLASS_' . $class));
 	else if (!isset($schedulable['class']))
-	    $schedulable['class'] = CLASS_PRIVATE; // padrão classe private
+	    $schedulable['class'] = CLASS_PRIVATE; // padrÃ£o classe private
 
 	/* Definindo RRULE */
@@ -906,5 +1392,5 @@
 	$participantsInEvent = array();
 
-	//TODO: Participants com delegated não estao sendo levados em conta
+	//TODO: Participants com delegated nÃ£o estao sendo levados em conta
 	while ($property = $component->getProperty('attendee', FALSE, TRUE)) {
 	    $participant = array();
@@ -923,5 +1409,5 @@
 	    $participant['isOrganizer'] = '0';
 
-	    /* Verifica se este usuario é um usuario interno do ldap */
+	    /* Verifica se este usuario Ã© um usuario interno do ldap */
 	    $intUser = Controller::find(array('concept' => 'user'), array('id', 'isExternal'), array('filter' => array('OR', array('=', 'mail', $mailUser), array('=', 'mailAlternateAddress', $mailUser))));
 
@@ -958,5 +1444,5 @@
 	    $participant['acl'] = 'rowi';
 
-	    /* Verifica se este usuario é um usuario interno do ldap */
+	    /* Verifica se este usuario Ã© um usuario interno do ldap */
 	    $intUser = Controller::find(array('concept' => 'user'), array('id', 'isExternal'), array('filter' => array('OR', array('=', 'mail', $mailUser), array('=', 'mailAlternateAddress', $mailUser))));
 
@@ -980,5 +1466,5 @@
 	    $interation['participant://' . $participantID] = $participant;
 	    $schedulable['participants'][] = $participantID;
-	} else if (!is_array($schedulable['participants']) || count($schedulable['participants']) < 1) {//caso não tenha organizador o usuario se torna organizador
+	} else if (!is_array($schedulable['participants']) || count($schedulable['participants']) < 1) {//caso nÃ£o tenha organizador o usuario se torna organizador
 	    $user = Controller::read(array('concept' => 'user', 'id' => $params['owner']), array('mail'));
 
@@ -1094,5 +1580,5 @@
 
     static private function _existInMyCalendars($id, $owner) {
-	$sig = Controller::find(array('concept' => 'calendarSignature'), array('user', 'calendar', 'isOwner'), array('filter' => array('AND', array('=', 'user', $owner), array('=', 'isOwner', '1'))));
+	$sig = Controller::find(array('concept' => 'calendarSignature'), array('user', 'calendar', 'isOwner'), array('filter' => array('AND', array('=', 'isOwner', '1'), array('=', 'user', $owner))));
 	$calendars = array();
 	foreach ($sig as $val)
