Ignore:
Timestamp:
02/14/12 16:52:04 (12 years ago)
Author:
acoutinho
Message:

Ticket #2434 - Implementacao anexos, acls e delegacao de participantes

Location:
trunk/prototype/modules/calendar
Files:
8 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/prototype/modules/calendar/constants.php

    r5415 r5514  
    55define('STATUS_CONFIRMED', 1); 
    66define('STATUS_ACCEPTED', 1); 
    7 define('STATUS_TENATIVE', 2); 
     7define('STATUS_TENTATIVE', 2); 
    88define('STATUS_DECLINED', 3); 
    99define('STATUS_CANCELLED', 3); 
     
    2929define('ICAL_ACTION_NONE', 4); 
    3030define('ICAL_ACTION_REPLY', 5); 
     31define('ICAL_ACTION_SUGGESTION', 6); 
    3132 
    3233?> 
  • trunk/prototype/modules/calendar/css/layout.css

    r5417 r5514  
    211211} 
    212212 
    213 .new-event-win fieldset.block-add-attendee-permissions {  
    214         width: 220px;  
    215         float:left;  
    216         margin: 105px 0 0 10px; 
    217 } 
     213.new-event-win ul.attendee-permissions-list, li.attendee-permissions-list{text-align: left;} 
     214 
     215li.attendee-permissions-list input{width: 20px !important; margin: 3px 0 0 0; !important} 
     216 
     217p.request-update{display: inline; position: relative; top: 2px;} 
     218 
     219 
     220p.request-update label{width: 150px !important;} 
    218221 
    219222.new-event-win .menu-addevent { 
     
    221224} 
    222225 
    223 fieldset.block-add-attendee .add-attendee-search { max-width: 200px; margin: 5px;} 
    224 fieldset.block-add-attendee .add-attendee-search input { max-width: 170px; } 
     226fieldset.block-add-attendee .add-attendee-search { max-width: 250px; margin: 5px;} 
     227fieldset.block-add-attendee .add-attendee-search input { max-width: 215px; width: 215px;} 
    225228fieldset.block-add-attendee .search-result-list { width: 255px; max-height: 215px; overflow: auto;} 
    226229fieldset.block-add-attendee .search-result-list .ui-widget-content { border: none;} 
     
    256259.attendees-list .me select.status { margin:10px 5px 5px 5px; } 
    257260.attendees-list .me .add-attendee-search { max-width: 155px; width:155px; display: inline; padding: 0; margin: 10px 0 5px 0;} 
     261 
     262.attendees-list .me .add-attendee-options { max-height: 16px; height:16px;  max-width: 50px; width:50px; display: inline; padding: 0; margin: 0 0 5px 0;} 
     263.attendees-list .me .add-attendee-options-read { max-height: 16px; height:16px;  max-width: 16px; width:16px; display: inline; padding: 0; margin: 0 0 5px 0;} 
     264 
     265.attendees-list .me .add-attendee-options-button {position: absolute; top: 171px;} 
     266.attendees-list .hover-attendee { background-color: #DFEFFC;} 
     267/* 
     268.attendees-list .attendee-options-button-edit { position: absolute; top:0; right:25px;} 
     269.attendees-list .attendee-options-button-key { position: absolute; top:0; right:45px;} 
     270.attendees-list .attendee-options-button-delegate { position: absolute; top:0; right:65px;} 
     271*/ 
     272 
     273.attendee-options{ position: absolute; top: 0; left: 300px; background-color: white; z-index: 100; width: 90px; background-color: #FFF; padding: 0 5px 0 3px; text-align: right;} 
     274.attendees-list .not-attendee { height:16px; } 
     275 
     276.list-delegates{margin: 0 0 0 25px;} 
     277 
     278.status-delegate{position: absolute; left:3px;} 
     279 
    258280.attendees-list .me .add-attendee-search input { max-width: 125px; } 
    259 .attendees-list li.organizer {margin-bottom: 3px;} 
     281.attendees-list li.organizer, .attendees-list li.me-delegated {margin-bottom: 3px;} 
    260282.attendees-list .organizer .button.swap { 
    261283        float: right; 
    262284        margin-top: -1.5em; 
    263285} 
     286 
     287.name-status-delegated{text-decoration: line-through; padding: 0 0 0 18px;} 
     288.name-status-delegated-delegated{text-decoration: line-through; padding: 0 0 0 12px;} 
     289.name-status-delegated-none{ padding: 0 0 0 12;} 
     290 
     291.name-status{padding: 0 0 0 18px;} 
     292 
     293.name-special{padding: 0 0 0 33px;} 
     294.name-special-delegated{text-decoration: line-through; padding: 0 0 0 33px;} 
     295 
     296.open-delegate{position: absolute; left: 20px; display: block; cursor: hand;} 
     297.space-status{position: absolute; left: 20px; display: block;} 
     298.space-special{position: absolute; left: 35px; display: block;} 
     299.space-special-delegated{position: absolute; left: 20px; display: block;} 
     300 
     301.attendee-permissions-change{background-image: url(../../../plugins/jquery/images/ui-icons_f9bd01_256x240.png) !important;} 
     302.attendee-permissions-change-button{border: 1px solid #79B7E7 !important; background: #F5F8F9 !important; font-weight: bold !important; color: #E17009 !important;} 
     303 
     304.attendee-permissions-conflict{opacity: 0.5} 
    264305 
    265306dd.attendee-list ul.attendee-list li { 
     
    275316dd.attendee-list ul.attendee-list li label.name, 
    276317dd.attendee-list ul.attendee-list li label.mail { 
    277         width: 6000px; 
    278         min-width: 6000px; 
     318        width: 99999px; 
     319        min-width: 99999px; 
    279320        vertical-align: middle; 
    280321} 
    281322dd.attendee-list ul.attendee-list li label[title=''] { display:none } 
     323/* 
    282324dd.attendee-list ul.attendee-list li .button.close { 
    283325        position: absolute; 
    284     right: 0; 
     326    right: 5px; 
    285327    top: 0; 
    286328} 
    287  
     329*/ 
    288330/* 
    289331.attendees-list li .ui-icon-float-right { 
     
    482524} 
    483525 
     526.button.add.button-add-attachment{margin: -9px 0 0 8px;} 
     527.button.upload{margin-bottom: 4px;} 
     528div.fileupload-buttonbar{padding: 0.2em 0.5em } 
     529.archive-error{color: #F00;} 
     530 
     531.progress.in-progress{width: 100px; height: 12px;} 
     532 
     533 
     534.lbl-archive-nome, .lbl-archive-size{font-weight: bold !important;} 
     535.lbl-archive-nome{width:40px !important;} 
     536.row.fileupload-buttonbar{margin-top: -14px; padding: 0.2em 0.7em;} 
     537 
     538.archive-nome{width: 73px;} 
     539.archive-nome label{display: block; position: absolute; left: 136px; top: 194px;} 
     540.archive-size{min-width:100px; max-width:100px;} 
     541 
     542 
    484543.input-group.date-info input { 
    485544        width: 100px; 
  • trunk/prototype/modules/calendar/css/style.css

    r5511 r5514  
    9090 
    9191.ui-dialog .ui-dialog-content { padding: 0; } 
    92 .new-event-win form.form-addevent { padding: 10px; } 
     92.new-event-win div.div-addevent { padding: 0; width: 700px; border: 0;} 
     93.new-event-win form.form-addevent { padding: 9px; } 
    9394 
    9495.expresso-calendar-container input[type="text"] { height: 18px; } 
  • trunk/prototype/modules/calendar/export.php

    r5399 r5514  
    3131       $eventsIds[] = $eventLink['schedulable']; 
    3232 
    33     $events = Controller::find(array('concept' => 'schedulable') , false , array('filter' => array('IN','id',$eventsIds) , 'deepness' => '2' )); 
     33    $events = Controller::find(array('concept' => 'schedulable') , false , array('filter' => array('IN','id',$eventsIds) , 'deepness' => '2' ));         
    3434    $ics = Controller::format( array( 'service' => 'iCal' ) , $events , array('defaultTZI' => $calendar['timezone']) ); 
    3535 
     
    4545{     
    4646    $event = Controller::read(array('concept' => 'schedulable' , 'id' => $params['event'])); 
     47        $attachmentRelation = Controller::find( array( 'concept' => 'schedulableToAttachment' ) , false ,array( 'filter' => array('=', 'schedulable'  ,  $event['id']) ));  
     48        if(is_array($attachmentRelation)){ 
     49                $attachments = array(); 
     50                foreach($attachmentRelation as $key => $value) 
     51                        if(isset($value['attachment']) || !!$value['attachment']) 
     52                                $attachments[$key]  = $value['attachment']; 
     53                //Pega os anexos sem source 
     54                $event['attachments'] = Controller::find( array( 'concept' => 'attachment' ) , false ,array( 'filter' => array('IN', 'id' , $attachments) ));  
     55        } 
     56                 
    4757    $ics = Controller::format( array( 'service' => 'iCal' ) , array($event) , array('defaultTZI' => $event['timezone']) ); 
    4858     
  • trunk/prototype/modules/calendar/interceptors/DBMapping.php

    r5462 r5514  
    4040        }   
    4141         
     42        public function encodeCreateSuggestion( &$uri , &$params , &$criteria , $original ){                     
     43        $params['dtstamp'] = (isset($params['dtstamp'])) ? $params['dtstamp'] :time().'000';           
     44    }    
     45         
    4246        public function encodeUpdateAlarm( &$uri , &$params , &$criteria , $original ){ 
    4347            if(isset($params['type'])) 
     
    4650         
    4751    public function encodeCreateAttachment( &$uri , &$params , &$criteria , $original ){ 
    48         $params['source'] = base64_encode( $params['source'] ); 
     52         
     53                if(!isset($params['source'])) return false; 
     54                 
     55                if(isset($_FILES[$params['source']])) 
     56                        if(isset($params['id'])) 
     57                                $params =  array_merge($_FILES[$params['source']], array('id' => $params['id'])); 
     58                        else 
     59                                $params =  $_FILES[$params['source']]; 
     60                 
     61                //$params['source'] = base64_encode( $params['source'] );        
     62                 
    4963        } 
     64 
    5065/////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    5166         
     
    145160    public function createCalendarToSchedulable( &$uri , &$result , &$criteria , $original ){            
    146161 
    147        Controller::create(array('concept' => 'calendarToSchedulable'), array('calendar' => $original['properties']['calendar'], 'schedulable' => $result['id'] )); 
    148              
    149    }    
     162                Controller::create(array('concept' => 'calendarToSchedulable'), array('calendar' => $original['properties']['calendar'], 'schedulable' => $result['id'] )); 
     163 
     164   } 
     165 
     166        public function createCreateSchedulableToAttachment( &$uri , &$params , &$criteria , $original ){                
     167                if(array_key_exists('attachments', $original['properties']))     
     168                        foreach($original['properties']['attachments'] as $key => $value){                               
     169                                if(isset($params['id'])) 
     170                                        Controller::create(array('concept' => 'schedulableToAttachment'), array('attachment' => $value['attachment'], 'schedulable' => $params['id'] )); 
     171                        } 
     172        } 
    150173      
    151174    //TODO: Remover apos suporte a deepness na api  
     
    172195                    }        
    173196                    $result[$i]['participants'] = $participants; 
    174                 }                
     197                 
     198                                        $attachmentRelation = Controller::find( array( 'concept' => 'schedulableToAttachment' ) , false ,array( 'filter' => array('=', 'schedulable'  ,  $v['id']) ));  
     199                                        if(is_array($attachmentRelation)){ 
     200                                                $attachments = array(); 
     201                                                foreach($attachmentRelation as $key => $value) 
     202                                                        if(isset($value['attachment']) || !!$value['attachment']) 
     203                                                                $attachments[$key]  = $value['attachment']; 
     204                                                //Pega os anexos sem source 
     205                                                $result[$i]['attachments'] = Controller::find( array( 'concept' => 'attachment' ) , array('id', 'name', 'type', 'size') ,array( 'filter' => array('IN', 'id' , $attachments) ));  
     206                                        } 
     207                                 
     208                                }                
    175209                 
    176210           } 
     
    294328        } 
    295329    } 
     330 
     331    public function decodeFindAttachment( &$uri , &$result , &$criteria , $original ){           
     332                if(isset($result)) 
     333                foreach($result as $key => &$value) 
     334                        $value['source'] = base64_decode($value['source']); 
     335    } 
     336 
    296337         
    297338        public function decodeSignatureAlarmType( &$uri , &$result , &$criteria , $original ){   
     
    389430        } 
    390431         
    391      } 
     432     }  
     433          
     434        public function deleteAttachmentDependences( &$uri , &$params , &$criteria , $original ){ 
     435 
     436                if(isset($original['URI']['id'])) 
     437                        Controller::delete(array('concept' => 'schedulableToAttachment', null , array('filter' => array('=' , 'attachment' , $original['URI']['id'])))); 
     438    } 
    392439 
    393440    public function createDefaultSignature( &$uri , &$result , &$criteria , $original ){ 
  • trunk/prototype/modules/calendar/interceptors/Notifications.php

    r5437 r5514  
    88{ 
    99     
    10     /** 
     10        public function formatNotification(&$uri , &$params , &$data , $original){       
     11                switch ($params['type']) { 
     12                        case 'suggestion': 
     13                                self::formatSuggestion($params);     
     14                                break; 
     15                        case 'suggestionResponse': 
     16                                self::formatSuggestionResponse($params);     
     17                                break; 
     18                        }  
     19        } 
     20         
     21         
     22        /** 
    1123    * Analisa o commit do conceito participant e encaminha cada participant para seu devido metodo de notrificação 
    1224    * 
     
    1931    */ 
    2032    public function commitParticipant(&$uri , &$result , &$data , $original) 
    21     {     
     33    {                            
    2234        if(Config::regGet('noAlarm') !== false) return; //Escapa notificações caso a flag de noAlarm esteja ativa. 
    23                
     35                 
    2436        $organizers = array(); //Cache Organizadores 
    2537        $schedulables = array(); //Cache Schedulables 
    26          
     38 
    2739        foreach ($data as $i => $concept)  
    2840        { 
     
    3951                foreach ($schedulables[ $concept['id'] ]['participants'] as $i => $v) //salva em $organizers as informações do organizador       
    4052                    if(($v['isOrganizer'] === '1') && ($organizers[$concept['id']] = $v) ) break; 
    41             } 
     53                        }else if($concept['concept'] === 'schedulableToAttachment') 
     54                        { 
     55                                $relationAttachment = Controller::find( array( 'concept' => 'schedulableToAttachment' ) , false ,array( 'filter' => array('=', 'id' , $concept['id'])));                         
     56                                                         
     57                                 
     58                                         
     59                                foreach($relationAttachment as $key => $value){ 
     60                                        if(!array_key_exists('attachments',$schedulables[$value['schedulable']])) 
     61                                                $schedulables[$value['schedulable']]['attachments'] = array(); 
     62 
     63                                        $temp = Controller::find( array( 'concept' => 'attachment' ) , false ,array( 'filter' => array('=', 'id' , $value['attachment']))); 
     64                                        array_push($schedulables[$value['schedulable']]['attachments'] , $temp[0]);                              
     65                                } 
     66                        } 
    4267        } 
    4368         
    4469        if( isset( $created ) ) 
    4570        { 
    46            $psCreated =  Controller::find(array('concept' => 'participant'), false , array('deepness' => '1' , 'filter' => array('IN', 'id' , $created ))); 
    47            foreach ($psCreated as $i => $pCreated)    
     71           $psCreated =  Controller::find(array('concept' => 'participant'), false , array('deepness' => '1' , 'filter' => array('IN', 'id' , $created )));                 
     72                   foreach ($psCreated as $i => $pCreated)    
    4873           {     
    4974               if($pCreated['isOrganizer'] == '1') continue; //escapa organizador 
     
    5277                
    5378               $organizer = isset( $organizers[$pCreated['schedulable']] ) ? $organizers[ $pCreated['schedulable'] ] : self::getOrganizer( $pCreated['schedulable'] ); 
    54                 
     79                            
     80                                if($pCreated['delegatedFrom'] != 0){ 
     81                                        self::participantDelegated( $pCreated , $schedulable , $organizer);     
     82                                        continue; 
     83                                } 
     84                            
    5585               switch ($pCreated['status'])  
    5686               { 
     
    6898        { 
    6999            $psUpdated  = Controller::find(array('concept' => 'participant'), false , array('deepness' => '1' , 'filter' => array('IN', 'id' , $updated ))); 
    70             foreach ($psUpdated as $i => $pUpdated)    
    71             { 
     100                        foreach ($psUpdated as $i => $pUpdated)    
     101            {                    
    72102                if($pUpdated['isOrganizer'] == '1') continue; //escapa organizador 
    73103                $schedulable = isset( $schedulables[$pUpdated['schedulable']] ) ? $schedulables[ $pUpdated['schedulable'] ] : Controller::read( array('concept' => 'schedulable', 'id' => $pUpdated['schedulable']) , false , array('deepness' => '2')); 
     
    77107                    if(($v['isOrganizer'] === '1') && ($organizer = $v) ) break; 
    78108                     
    79                  
    80                 if( $pUpdated['status'] != STATUS_UNANSWERED) 
    81                 self::participantStatusChange( $pUpdated['id'] , $schedulable , $organizer , $pUpdated['status'] );     
     109                if($pUpdated['delegatedFrom'] != 0){ 
     110                                        self::participantDelegatedStatusChange( $pUpdated , $schedulable , $organizer , $pUpdated['status'] );     
     111                }else if( $pUpdated['status'] != STATUS_UNANSWERED && $pUpdated['status'] != STATUS_DELEGATED) 
     112                                        self::participantStatusChange( $pUpdated['id'] , $schedulable , $organizer , $pUpdated['status'] );     
    82113            } 
    83114        } 
    84115    } 
    85      
    86  
    87     /** 
    88     * Monta o email de convite que sera enviado ao participant 
    89     * 
    90     * @license    http://www.gnu.org/copyleft/gpl.html GPL 
    91     * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) 
    92     * @sponsor    Caixa Econômica Federal 
    93     * @author     Cristiano Corrêa Schmidt 
    94     * @return     void 
    95     * @access     public 
    96     */ 
    97     public static function participantCreated( &$partID , &$schedulable ) 
    98     { 
     116         
     117        public function formatSuggestion(&$params){ 
     118             
     119                $schedulable =  Controller::read(  array( 'concept' => 'schedulable' , 'id' => $params['schedulable'] ) , null , array('deepness' => '2') ) ; 
     120                 
     121                foreach ($schedulable['participants'] as $i => $v) //salva em $organizer as informações do organizador       
     122            if(($v['isOrganizer'] === '1') && ($organizer = $v) ) break; 
     123                 
     124                $method = 'COUNTER'; 
     125                $notificationType = 'Sugestão de horário'; 
     126                $part = 'other'; 
     127                 
     128                $schedulableReference = $schedulable; 
     129                 
     130                $referenceSuggestion = array( 'startTime' => $params['startTime'], 
     131                                                                        'endTime' => $params['endTime'], 
     132                                                                        'allDay' => $params['allDay'] 
     133                                                                ); 
     134                $schedulable = array_merge($schedulable, $referenceSuggestion); 
     135                 
     136                self::mountStruture(false, $schedulable, false , $data,  $subject, $ical, $part, $method, $notificationType); 
     137                        
     138 
     139                $timezone = new DateTimeZone('UTC'); 
     140                $sTime = new DateTime( '@'.(int)($schedulableReference['startTime'] / 1000) , $timezone ); 
     141                $eTime =  new DateTime( '@'.(int)($schedulableReference['endTime'] / 1000) , $timezone );  
     142            
     143                if(isset($schedulableReference['timezone'])) 
     144                { 
     145                        $sTime->setTimezone(new DateTimeZone($schedulableReference['timezone'])); 
     146                        $eTime->setTimezone(new DateTimeZone($schedulableReference['timezone'])); 
     147                } 
     148 
     149                $data['nowStartDate'] = date_format( $sTime , 'd/m/Y'); 
     150        $data['nowStartTime'] = ($schedulableReference['allDay']) ? '' : date_format( $sTime , 'H:i'); 
     151        $data['nowEndDate'] = date_format( $eTime , 'd/m/Y'); 
     152        $data['nowEndTime'] = ($schedulableReference['allDay']) ? '' :  date_format( $eTime , 'H:i'); 
     153                $data['userRequest'] = Config::me('uid'); 
     154                 
     155                $params['attachments'][] = $ical; 
     156                $params['isHtml'] = true;                          
     157                $params['body'] = parseTPL::load_tpl( $data ,ROOTPATH.'/modules/calendar/templates/notify_suggestion_body.tpl'); 
     158                $params['subject'] = parseTPL::load_tpl( $subject ,ROOTPATH.'/modules/calendar/templates/notify_subject.tpl');; 
     159                $params['from'] = Config::me('mail');    
     160                $params['to'] = $organizer['user']['mail']; 
     161                 
     162        }   
     163         
     164        public function formatSuggestionResponse(&$params){      
     165                $schedulable = $params['schedulable']; 
     166                foreach ($schedulable['participants'] as $i => $v) {//salva em $organizer as informações do organizador       
     167            if($v['isOrganizer'] === '1') $organizer = $v; 
     168                        if($v['user']['mail'] == Config::me('mail')) $me = $v; 
     169                } 
     170                $method = 'DECLINECOUNTER'; 
     171                $notificationType = 'Sugestão de horário'; 
     172                $part = 'other'; 
     173                 
     174                $schedulable['participants'] = array(); 
     175                array_push($schedulable['participants'], $me, $organizer); 
     176                 
     177                self::mountStruture(false, $schedulable, false , $data,  $subject, $ical, $part, $method, $notificationType); 
     178                 
     179                if($params['status'] == 'DECLINECOUNTER') 
     180                        $data['status'] = 'não pode ser aceito'; 
     181                         
     182                $params['attachments'][] = $ical; 
     183                $params['isHtml'] = true;                          
     184                $params['body'] = parseTPL::load_tpl( $data ,ROOTPATH.'/modules/calendar/templates/notify_suggestion_response_body.tpl'); 
     185                $params['subject'] = parseTPL::load_tpl( $subject ,ROOTPATH.'/modules/calendar/templates/notify_subject.tpl');; 
     186                $params['to'] = $params['from']; 
     187                $params['from'] = Config::me('mail');    
     188        } 
     189         
     190         
     191        public static function _getAttendeeById($attendeId, $schedulable){ 
     192                foreach ($schedulable['participants'] as $id => $dv)  
     193                        if($dv['id'] == $attendeId ) 
     194                                return $dv; 
     195        } 
     196         
     197        /** 
     198    * Prepara para criação de email de delegação 
     199    * 
     200    * @license    http://www.gnu.org/copyleft/gpl.html GPL 
     201    * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) 
     202    * @sponsor    Caixa Econômica Federal 
     203    * @author     Adriano Coutinho da Silva 
     204    * @return     void 
     205    * @access     public 
     206    */ 
     207        public static function participantDelegated( &$partID , &$schedulable , &$organizer){ 
     208         
     209                $delegatedParams = array(); 
     210                 
     211                $delegatedFrom = self::_getAttendeeById($partID['delegatedFrom'], $schedulable); 
     212                $delegatedParams['delegatedFrom'] = $delegatedFrom['user']['uid']; 
     213                 
     214                self::participantCreated( $partID['id'] , $schedulable , STATUS_DELEGATED, $delegatedParams );           
     215                 
     216                $delegatedTo = self::_getAttendeeById($partID['id'], $schedulable); 
     217                $delegatedParams['delegated'] = $delegatedTo['user']['uid']; 
     218                 
     219                self::participantStatusChange( $partID['delegatedFrom'] , $schedulable , $organizer , STATUS_DELEGATED, $delegatedParams ); 
     220        } 
     221         
     222        /** 
     223    * Monta o email de resposta que sera enviado ao delegatedFrom 
     224    * 
     225    * @license    http://www.gnu.org/copyleft/gpl.html GPL 
     226    * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) 
     227    * @sponsor    Caixa Econômica Federal 
     228    * @author     Cristiano Corrêa Schmidt 
     229    * @return     void 
     230    * @access     public 
     231    */ 
     232    public static function participantDelegatedStatusChange( &$partID , &$schedulable, $organizer, &$type = false){ 
     233         
     234                $delegatedParams = array(); 
     235                                         
     236                $delegated = self::_getAttendeeById($partID['id'], $schedulable); 
     237                $delegatedParams['delegated'] = $delegated['user']['uid'];               
     238                 
     239                switch($partID['status']){ 
     240            case STATUS_ACCEPTED: 
     241                $delegatedParams['status'] = 'aceitou'; 
     242            break; 
     243            case STATUS_TENTATIVE: 
     244                $delegatedParams['status'] = 'marcou como tentativa'; 
     245            break; 
     246            case STATUS_CANCELLED: 
     247                $delegatedParams['status'] = 'rejeitou'; 
     248            break; 
     249                        case STATUS_DELEGATED: 
     250                                $delegatedParams['status'] = 'delegou para um novo participante'; 
     251            break; 
     252                } 
     253                        //notifica o organizador a resposta do delegado 
     254                        self::participantStatusChange( $partID['delegatedFrom'] , $schedulable , $organizer , $type, $delegatedParams ); 
     255         
     256                        $method = 'REQUEST'; 
     257                        $notificationType = 'Resposta Delegação';  
     258                        $part = 'attendees'; 
     259                        self::mountStruture($partID['delegatedFrom'], $schedulable, $type , $data,  $subject, $ical, $part, $method, $notificationType ); 
     260                         
     261                        $data = array_merge($data, $delegatedParams); 
     262                         
     263            self::sendMail($data, $ical , $part['user']['mail'] , $subject , 'notify_response_delegated_status_body'); 
     264        
     265    } 
     266 
     267        public static function mountStruture( $partID , &$schedulable, $type = false, &$data, &$subject, &$ical, &$part = false, &$method, &$notificationType, $regSet = false) { 
     268                 
     269                if( (Config::regGet('ical://'.$schedulable['id'].'/'.$method) === false) || ($method == 'CANCEL') ) //Verifica se o ical ja não esta no reg 
     270                { 
     271                        $schedulable['URI']['concept'] = 'schedulable'; 
     272                        $ical['source'] = Controller::format( array( 'service' => 'iCal' ) , array($schedulable) , array('method' => $method) );   
     273                        $ical['type'] = 'text/calendar'; 
     274                        $ical['name'] = 'calendar.ics'; 
     275                        if($regSet) 
     276                                Config::regSet('ical://'.$schedulable['id'].'/'.$method, $ical); 
     277                } 
     278                else 
     279                        $ical = Config::regGet('ical://'.$schedulable['id'].'/'.$method); 
    99280         
    100            $part = false; 
    101            if( Config::regGet('ical://'.$schedulable['id'].'/REQUEST') === false ) //Verifica se o ical ja não esta no reg 
    102            { 
    103                   $schedulable['URI']['concept'] = 'schedulable'; 
    104                   $ical['source'] = Controller::format( array( 'service' => 'iCal' ) , array($schedulable) , array('method' => 'REQUEST') );   
    105                   $ical['type'] = 'text/calendar'; 
    106                   $ical['name'] = 'calendar.ics'; 
    107                   Config::regSet('ical://'.$schedulable['id'].'/REQUEST', $ical); 
    108            } 
    109            else 
    110                 $ical = Config::regGet('ical://'.$schedulable['id'].'/REQUEST'); 
    111          
    112            $timezone = new DateTimeZone('UTC'); 
    113            $sTime = new DateTime( '@'.(int)($schedulable['startTime'] / 1000) , $timezone ); 
    114            $eTime =  new DateTime( '@'.(int)($schedulable['endTime'] / 1000) , $timezone );  
     281                        $timezone = new DateTimeZone('UTC'); 
     282                        $sTime = new DateTime( '@'.(int)($schedulable['startTime'] / 1000) , $timezone ); 
     283                        $eTime =  new DateTime( '@'.(int)($schedulable['endTime'] / 1000) , $timezone );  
    115284            
    116            if(isset($schedulable['timezone'])) 
    117            { 
    118                $sTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 
    119                $eTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 
    120            } 
     285                        if(isset($schedulable['timezone'])) 
     286                        { 
     287                                $sTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 
     288                                $eTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 
     289                        } 
    121290             
    122            $attList = '<UL> '; 
    123            foreach ($schedulable['participants'] as $i => $v)   
    124            {    
    125                 if($part === false && $v['id'] == $partID) 
    126                    $part = $v; 
    127  
    128                 $attList .= ' <LI> '. (isset($v['user']['name']) ? $v['user']['name'] : $v['user']['mail']) ; 
    129            } 
    130            $attList .= '</UL>'; 
    131                              
    132            $data = array(     'startDate' =>  date_format( $sTime , 'd/m/Y') , 
     291                        $data = array(     'startDate' =>  date_format( $sTime , 'd/m/Y') , 
    133292                              'startTime' =>  ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i') , 
    134293                              'endDate' =>  date_format( $eTime , 'd/m/Y') , 
     
    136295                              'eventTitle' =>  $schedulable['summary'], 
    137296                              'eventLocation' =>  $schedulable['location'], 
    138                               'timezone' =>  ($schedulable['timezone']) ? $schedulable['timezone'] : 'UTC' , 
    139                               'participants' =>  $attList); 
    140              
    141              $subject['notificationType'] = 'Convite de Calendario'; 
    142              $subject['eventTitle'] = mb_convert_encoding($schedulable['summary'],'ISO-8859-1','ISO-8859-1,UTF-8'); 
    143              $subject['startDate'] = date_format( $sTime , 'd/m/Y'); 
    144              $subject['startTime'] = ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i'); 
    145              $subject['endDate'] = date_format( $eTime , 'd/m/Y'); 
    146              $subject['endTime'] = ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i'); 
    147              $subject['participant'] = Config::me('uid'); 
    148   
    149              self::sendMail($data, $ical , $part['user']['mail'] , $subject , 'notify_create_body'); 
     297                              'timezone' =>  ($schedulable['timezone']) ? $schedulable['timezone'] : 'UTC'); 
     298                        $temp = $part; 
     299                        $part = false; 
     300                        switch($temp){ 
     301                                case 'attendees': 
     302                                        $attList = '<UL> '; 
     303                                        foreach ($schedulable['participants'] as $i => $v)   
     304                                        {                
     305                                                if($part === false && $v['id'] == $partID) 
     306                                                   $part = $v; 
     307 
     308                                                $attList .= ' <LI> '. (isset($v['user']['name']) ? $v['user']['name'] : $v['user']['mail']) ; 
     309                                        } 
     310                                        $attList .= '</UL>'; 
     311                                        $data['participants'] = $attList; 
     312                                break; 
     313                                case 'me': 
     314                                        $part = self::_getAttendeeById($partID, $schedulable); 
     315                                        $data['participant'] = isset($part['user']['name']) ? $part['user']['name'] : $part['user']['mail']; 
     316                                break; 
     317                                case 'othersAttendees': 
     318                                        $data['participants'] = '<UL> '; 
     319                                        foreach ($schedulable['participants'] as $ii => $participant){ 
     320                                                if(Config::me('mail') !== $participant['user']['mail']) 
     321                                                        $part[] = $participant['user']['mail']; 
     322                                         
     323                                        $data['participants'] .= ' <LI> '. (isset($participant['user']['name']) ? $participant['user']['name'] : $participant['user']['mail']) ; 
     324                                        } 
     325                                break; 
     326                        }          
     327                        $subject['notificationType'] = $notificationType; 
     328                        $subject['eventTitle'] = mb_convert_encoding($schedulable['summary'],'ISO-8859-1','ISO-8859-1,UTF-8'); 
     329                        $subject['startDate'] = date_format( $sTime , 'd/m/Y'); 
     330                        $subject['startTime'] = ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i'); 
     331                        $subject['endDate'] = date_format( $eTime , 'd/m/Y'); 
     332                        $subject['endTime'] = ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i'); 
     333                        $subject['participant'] = Config::me('uid'); 
     334        } 
     335         
     336         
     337    /** 
     338    * Monta o email de convite que sera enviado ao participant 
     339    * 
     340    * @license    http://www.gnu.org/copyleft/gpl.html GPL 
     341    * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) 
     342    * @sponsor    Caixa Econômica Federal 
     343    * @author     Cristiano Corrêa Schmidt 
     344    * @return     void 
     345    * @access     public 
     346    */ 
     347    public static function participantCreated( &$partID , &$schedulable, $type = false, $delegatedParams = false) 
     348    {    
     349                $method = 'REQUEST'; 
     350                $notificationType = 'Convite de Calendario';  
     351                $part = 'attendees'; 
     352                self::mountStruture($partID, $schedulable, $type , $data,  $subject, $ical, $part, $method, $notificationType, true); 
     353         
     354                if($delegatedParams) 
     355                        $data = array_merge($data, $delegatedParams); 
     356                                          
     357                 self::sendMail($data, $ical , $part['user']['mail'] , $subject , !$delegatedParams  ? 'notify_create_body' : 'notify_create_delegated_body' ); 
    150358        
    151359    } 
     
    161369    * @access     public 
    162370    */ 
    163     public static function participantStatusChange( &$partID , &$schedulable , &$organizer , $type ) 
    164     { 
    165         $part = false; 
    166          
    167         foreach ($schedulable['participants'] as $i => $v) //salva em $part as informações do participant a ser notificado      
    168             if(($v['id'] == $partID) && ($part = $v) ) break; 
    169              
    170         if( Config::regGet('ical://'.$schedulable['id'].'/REPLY') === false ) //Verifica se o ical ja não esta no reg 
    171         { 
    172                   $schedulable['URI']['concept'] = 'schedulable'; 
    173                   $ical['source'] = Controller::format( array( 'service' => 'iCal' ) , array($schedulable) , array('method' => 'REPLY' , 'participant' => $partID) );   
    174                   $ical['type'] = 'text/calendar'; 
    175                   $ical['name'] = 'calendar.ics'; 
    176                   Config::regSet('ical://'.$schedulable['id'].'/REPLY', $ical); 
    177          } 
    178          else 
    179             $ical = Config::regGet('ical://'.$schedulable['id'].'/REPLY'); 
    180          
    181          
    182         $timezone = new DateTimeZone('UTC'); 
    183         $sTime = new DateTime( '@'.(int)($schedulable['startTime'] / 1000) , $timezone ); 
    184         $eTime =  new DateTime( '@'.(int)($schedulable['endTime'] / 1000) , $timezone );  
    185          
    186         if(isset($schedulable['timezone'])) 
    187         { 
    188             $sTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 
    189             $eTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 
    190         } 
    191          
    192         $data = array('startDate' =>  date_format( $sTime , 'd/m/Y') , 
    193                           'startTime' =>  ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i') , 
    194                           'endDate' =>  date_format( $eTime , 'd/m/Y') , 
    195                           'endTime' =>  ($schedulable['allDay']) ? '' :  date_format( $eTime , 'H:i') , 
    196                           'eventTitle' =>  $schedulable['summary'], 
    197                           'eventLocation' =>  $schedulable['location'], 
    198                           'timezone' =>  ($schedulable['timezone']) ? $schedulable['timezone'] : 'UTC' , 
    199                           'participant' =>  (isset($part['user']['name']) ? $part['user']['name'] : $part['user']['mail']) ); 
    200            
    201         $subject['notificationType'] = 'Convite Aceito'; 
    202         $subject['eventTitle'] = mb_convert_encoding($schedulable['summary'],'ISO-8859-1','ISO-8859-1,UTF-8'); 
    203         $subject['startDate'] = date_format( $sTime , 'd/m/Y'); 
    204         $subject['startTime'] = ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i'); 
    205         $subject['endDate'] = date_format( $eTime , 'd/m/Y'); 
    206         $subject['endTime'] = ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i'); 
    207         $subject['participant'] = Config::me('uid'); 
    208            
     371    public static function participantStatusChange( &$partID , &$schedulable , &$organizer , $type, $delegatedParams = false ) 
     372    {    
     373        $method = 'REPLY'; 
     374                $notificationType = 'Convite Aceito'; 
     375                $part = 'me'; 
     376                 
     377                self::mountStruture($partID, $schedulable, $type , $data,  $subject, $ical, $part, $method, $notificationType, true ); 
     378                        
     379                if($delegatedParams){ 
     380                        $data = array_merge($data, $delegatedParams); 
     381                        $tplDelegated = 'notify_delegated_status_body'; 
     382                } 
     383 
    209384       switch($type) 
    210385       { 
    211386            case STATUS_ACCEPTED: 
    212                 $tpl =   'notify_accept_body'; 
     387                $tpl =   !$delegatedParams ? 'notify_accept_body' : $tplDelegated; 
    213388                $subject['notificationType'] = 'Convite Aceito'; 
    214389            break; 
    215             case STATUS_TENATIVE: 
    216                 $tpl =   'notify_attempt_body'; 
     390            case STATUS_TENTATIVE: 
     391                $tpl =   !$delegatedParams ? 'notify_attempt_body' : $tplDelegated; 
    217392                $subject['notificationType'] = 'Convite  aceito provisoriamente'; 
    218393            break; 
    219394            case STATUS_CANCELLED: 
    220                 $tpl =   'notify_reject_body'; 
     395                $tpl =   !$delegatedParams ? 'notify_reject_body' : $tplDelegated; 
    221396                $subject['notificationType'] = 'Convite rejeitado'; 
     397            break; 
     398                        case STATUS_DELEGATED: 
     399                                if($delegatedParams) 
     400                                        $data = array_merge($data, $delegatedParams); 
     401                $tpl =   'notify_delegated_body'; 
     402                $subject['notificationType'] = 'Convite delegado'; 
    222403            break; 
    223404 
     
    264445       if((Config::regGet('noAlarm') === false) && (self::futureEvent( $schedulable['startTime'] , $schedulable['rangeEnd']))) 
    265446       { 
    266            $schedulable['URI']['concept'] = 'schedulable';  
    267            $timezone = new DateTimeZone('UTC'); 
    268            $sTime = new DateTime( '@'.(int)($schedulable['startTime'] / 1000) , $timezone ); 
    269            $eTime =  new DateTime( '@'.(int)($schedulable['endTime'] / 1000) , $timezone );  
    270             
    271            if(isset($schedulable['timezone'])) 
    272            { 
    273                $sTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 
    274                $eTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 
    275            } 
    276             
    277            $data =  array('startDate' =>  date_format( $sTime , 'd/m/Y') , 
    278                               'startTime' =>  ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i') , 
    279                               'endDate' =>  date_format( $eTime , 'd/m/Y') , 
    280                               'endTime' =>  ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i') , 
    281                               'eventTitle' =>  $schedulable['summary'], 
    282                               'eventLocation' =>  $schedulable['location'], 
    283                               'timezone' =>  ($schedulable['timezone']) ? $schedulable['timezone'] : 'UTC'); 
    284                                
    285             
    286            $ical['source'] = Controller::format( array( 'service' => 'iCal' ) , array($schedulable) , array('method' => 'CANCEL'));   
    287            $ical['type'] = 'text/calendar'; 
    288            $ical['name'] = 'calendar.ics'; 
    289             
    290            foreach ($schedulable['participants'] as $ii => $participant) 
    291                 if(Config::me('mail') !== $participant['user']['mail']) 
    292                     $to[] = $participant['user']['mail']; 
    293                      
    294              $subject['notificationType'] = 'Cancelamento de Calendario'; 
    295              $subject['eventTitle'] = mb_convert_encoding($schedulable['summary'],'ISO-8859-1','ISO-8859-1,UTF-8'); 
    296              $subject['startDate'] = date_format( $sTime , 'd/m/Y'); 
    297              $subject['startTime'] = ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i'); 
    298              $subject['endDate'] = date_format( $eTime , 'd/m/Y'); 
    299              $subject['endTime'] = ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i'); 
    300              $subject['participant'] = Config::me('uid');      
     447                        $method = 'CANCEL'; 
     448                        $notificationType = 'Cancelamento de Calendario'; 
     449                        $part = 'othersAttendees'; 
     450                        self::mountStruture($uri['id'], $schedulable, false , $data,  $subject, $ical, $part, $method, $notificationType ); 
    301451                 
    302            if(count($to) > 0) 
    303             self::sendMail($data, $ical , implode(',' , $to) ,$subject, 'notify_cancel_body'); 
     452           if(count($part) > 0) 
     453            self::sendMail($data, $ical , implode(',' , $part) ,$subject, 'notify_cancel_body'); 
    304454       } 
    305455    } 
     
    323473       if((Config::regGet('noAlarm') === false) && (self::futureEvent( $schedulable['startTime'] , $schedulable['rangeEnd']))) 
    324474       {   
    325            $schedulable['URI']['concept'] = 'schedulable';  
    326            $timezone = new DateTimeZone('UTC'); 
    327            $sTime = new DateTime( '@'.(int)($schedulable['startTime'] / 1000) , $timezone ); 
    328            $eTime =  new DateTime( '@'.(int)($schedulable['endTime'] / 1000) , $timezone );  
    329             
    330            if(isset($schedulable['timezone'])) 
    331            { 
    332                $sTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 
    333                $eTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 
    334            } 
    335             
    336            $data =  array('startDate' =>  date_format( $sTime , 'd/m/Y') , 
    337                               'startTime' => ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i') , 
    338                               'endDate' =>  date_format( $eTime , 'd/m/Y') , 
    339                               'endTime' => ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i') , 
    340                               'eventTitle' =>  $schedulable['summary'], 
    341                               'eventLocation' =>  $schedulable['location'], 
    342                               'timezone' =>  ($schedulable['timezone']) ? $schedulable['timezone'] : 'UTC'); 
    343  
    344            $ical['source'] = Controller::format( array( 'service' => 'iCal' ) , array($schedulable) , array('method' => 'CANCEL'));   
    345            $ical['type'] = 'text/calendar'; 
    346            $ical['name'] = 'calendar.ics'; 
    347             
    348              $subject['notificationType'] = 'Cancelamento de Calendario'; 
    349              $subject['eventTitle'] = mb_convert_encoding($schedulable['summary'],'ISO-8859-1','ISO-8859-1,UTF-8'); 
    350              $subject['startDate'] = date_format( $sTime , 'd/m/Y'); 
    351              $subject['startTime'] = ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i'); 
    352              $subject['endDate'] = date_format( $eTime , 'd/m/Y'); 
    353              $subject['endTime'] = ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i'); 
    354              $subject['participant'] = Config::me('uid'); 
    355                            
    356            self::sendMail($data, $ical , $participant['user']['mail'] , $subject , 'notify_cancel_body');   
     475                        $method = 'CANCEL'; 
     476                        $notificationType = 'Cancelamento de Calendario'; 
     477                        $part = 'others'; 
     478                        self::mountStruture(false, $schedulable, false , $data,  $subject, $ical, $part, $method, $notificationType ); 
     479                                             
     480                        self::sendMail($data, $ical , $participant['user']['mail'] , $subject , 'notify_cancel_body');   
    357481        } 
    358482    } 
     
    369493    */ 
    370494    public function updateEvent( &$uri , &$params , &$criteria , $original  ) 
    371     { 
    372         
    373        $schedulableOld =  Controller::read( array( 'concept' => 'schedulable' , 'id' => $uri['id'] ) , null , array('deepness' => '2') ) ;       
     495    {        
     496       $schedulableOld =  Controller::find( array( 'concept' => 'schedulable' , 'id' => $uri['id'] ) , null , array('deepness' => '2') ) ;       
    374497       $schedulable = $schedulableOld; 
    375498       $alt = false; 
    376         
    377        
     499 
    378500       foreach ($params as $i => $v) //Verifica se ouve alteração no evento 
    379501           if( isset( $schedulableOld[$i] ) && $schedulableOld[$i] != $v && $i != 'participants') 
     
    384506            
    385507       if ( ($alt === true) && (Config::regGet('noAlarm') === false) && (self::futureEvent($schedulable['startTime'], $schedulable['rangeEnd'])) )  
    386        { 
    387             $schedulable['URI']['concept'] = 'schedulable'; 
    388             $ical['source'] = Controller::format(array('service' => 'iCal'), array($schedulable), array('method' => 'REQUEST')); 
    389             $ical['type'] = 'text/calendar'; 
    390             $ical['name'] = 'calendar.ics'; 
    391  
    392             $timezone = new DateTimeZone('UTC'); 
    393             $sTime = new DateTime('@' . (int) ($schedulable['startTime'] / 1000), $timezone); 
    394             $eTime = new DateTime('@' . (int) ($schedulable['endTime'] / 1000), $timezone); 
    395  
    396             if (isset($schedulable['timezone'])) { 
    397                 $sTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 
    398                 $eTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 
    399             } 
    400             ///Montando lista de participantes 
    401             $attList = '<UL> '; 
    402             foreach ($schedulable['participants'] as $ii => $participant) 
    403                 $attList .= ' <LI> ' . (isset($participant['user']['name']) ? $participant['user']['name'] : $participant['user']['mail']); 
    404             $attList .= ' </UL>'; 
    405             ///////////////////////// 
    406  
    407             $data = array('startDate' => date_format($sTime, 'd/m/Y'), 
    408                 'startTime' => ($schedulable['allDay']) ? '' : date_format($sTime, 'H:i'), 
    409                 'endDate' => date_format($eTime, 'd/m/Y'), 
    410                 'endTime' => ($schedulable['allDay']) ? '' : date_format($eTime, 'H:i'), 
    411                 'eventTitle' => $schedulable['summary'], 
    412                 'eventLocation' => $schedulable['location'], 
    413                 'timezone' => ($schedulable['timezone']) ? $schedulable['timezone'] : 'UTC', 
    414                 'participants' => $attList 
    415             ); 
    416  
    417  
    418             foreach ($schedulable['participants'] as $ii => $participant) 
    419                 if (Config::me('mail') !== $participant['user']['mail']) 
    420                     $to[] = $participant['user']['mail']; 
    421  
    422             $subject['notificationType'] = 'Modificação de Calendario'; 
    423             $subject['eventTitle'] = mb_convert_encoding($schedulable['summary'],'ISO-8859-1','ISO-8859-1,UTF-8'); 
    424             $subject['startDate'] = date_format($sTime, 'd/m/Y'); 
    425             $subject['startTime'] = ($schedulable['allDay']) ? '' : date_format($sTime, 'H:i'); 
    426             $subject['endDate'] = date_format($eTime, 'd/m/Y'); 
    427             $subject['endTime'] = ($schedulable['allDay']) ? '' : date_format($eTime, 'H:i'); 
    428             $subject['participant'] = Config::me('uid'); 
    429               
    430             if ( isset($to) && count($to) > 0) 
    431                 self::sendMail($data, $ical, implode(',', $to), $subject, 'notify_modify_body'); 
     508       {                         
     509                        $method = 'REQUEST'; 
     510                        $notificationType = 'Modificação de Calendario';  
     511                        $part = 'othersAttendees'; 
     512                        self::mountStruture($partID, $schedulable, $type , $data,  $subject, $ical, $part, $method, $notificationType); 
     513 
     514            if ( isset($part) && count($part) > 0) 
     515                self::sendMail($data, $ical, implode(',', $part), $subject, 'notify_modify_body'); 
    432516        } 
    433517    } 
  • trunk/prototype/modules/calendar/js/calendar.codecs.js

    r5468 r5514  
    2929                this.preferenceIds = pref.ids; 
    3030    } 
     31} 
     32 
     33constantsParticipant = { 
     34        'o' : 'organization', 
     35        'w' : 'write', 
     36        'p' : 'participationRequired', 
     37        'i' : 'inviteGuests', 
     38        'r' : 'read' 
    3139} 
    3240 
     
    333341}); 
    334342 
     343DataLayer.codec( "suggestion", "duration", { 
     344 
     345    decoder: function( evtObj ){ 
     346                if( notArray = $.type(evtObj) !== "array" ) 
     347                        evtObj = [ evtObj ]; 
     348 
     349 
     350 
     351                var meAttendee = function(attendees){ 
     352                        for(var i = 0; i < attendees.length; i++) 
     353                                if(DataLayer.get('participant', attendees[i]).user == User.me.id) 
     354                                        return attendee; 
     355                }; 
     356 
     357                var res = $.map(evtObj, function( form ){        
     358                        return { 
     359                                participant : meAttendee(form.attendee),  
     360                                startTime: Timezone.getDateUTC(Date.parseExact(form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ), tzId).getTime(), 
     361                                endTime:  parseInt(Timezone.getDateUTC(Date.parseExact(form.endDate + ( !!form.allDay ? " 00:00": " "+$.trim(form.endHour)), formatString ), tzId).getTime()) + (!!form.allDay ? 86400000 : 0) , 
     362                                allDay: ( !!form.allDay ? 1 : 0 ), 
     363                                schedulable: form.idEvent 
     364                        } 
     365                });      
     366         
     367 
     368        return notArray ? res[0] : res; 
     369        }, 
     370         
     371        encoder: function( evtObj ){} 
     372         
     373}); 
     374 
     375DataLayer.codec( "attachment", "detail", { 
     376   
     377        decoder: function(evtObj){ 
     378         
     379                if( notArray = $.type(evtObj) !== "array" ) 
     380                        evtObj = [ evtObj ]; 
     381 
     382                var res = $.map(evtObj, function( form){ 
     383                        return [$.map(form.files , function( files){ 
     384                                        return { source: files }; 
     385                                })]; 
     386                }); 
     387        return notArray ? res[0] : res; 
     388        }, 
     389       
     390        encoder: function(){} 
     391 
     392       
     393}); 
     394 
    335395DataLayer.codec( "schedulable", "preview", { 
    336396 
     
    348408                                id: form.idEvent, 
    349409                                calendar: form.calendar, 
    350                                 participants : [{ 
    351                                         user: User.me.id, 
    352                                         status: form.status, 
    353                                         id: form.meId, 
    354                                         isOrganizer: 0, 
    355                                         alarms: typeof(form.alarmTime) != 'undefined' ?  
    356                                                 $.map( form.alarmTime || [], function( alarmTime, i ){ 
    357  
    358                                                         if( alarmTime === "" ) 
    359                                                                 return( null ); 
    360  
    361                                                         return !!form.alarmId[i] ? 
    362                                                                 { type: form.alarmType[i], unit: form.alarmUnit[i], time: form.alarmTime[i], id: form.alarmId[i] } :  
    363                                                                 { type: form.alarmType[i],unit: form.alarmUnit[i], time: form.alarmTime[i] }; 
    364                                                 }) : [] 
    365                                         }] 
     410                                participants : $.map(form.attendee, function( attendee, i ){ 
     411                                        if(isNaN(attendee)){ 
     412                                                return{ 
     413                                                        id: attendee, 
     414                                                        acl: form.attendeeAcl[i], 
     415                                                        delegatedFrom: !!form.delegatedFrom[i] ? form.delegatedFrom[i] : 0, 
     416                                                        isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ), 
     417                                                        isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0, 
     418                                                        acl: form.attendeeAcl[i].replace('o', '') 
     419                                                }; 
     420                                        }else{ 
     421                                                if(DataLayer.get('participant', attendee).user == User.me.id){ 
     422                                                        var me = { 
     423                                                                user: User.me.id, 
     424                                                                status: form.status, 
     425                                                                id: attendee, 
     426                                                                isOrganizer: 0, 
     427                                                                receiveNotification : (!!form.receiveNotification ? 1 : 0), 
     428                                                                alarms: typeof(form.alarmTime) != 'undefined' ?  
     429                                                                        $.map( form.alarmTime || [], function( alarmTime, i ){ 
     430 
     431                                                                                if( alarmTime === "" ) 
     432                                                                                        return( null ); 
     433 
     434                                                                                return !!form.alarmId[i] ? 
     435                                                                                        { type: form.alarmType[i], unit: form.alarmUnit[i], time: form.alarmTime[i], id: form.alarmId[i] } :  
     436                                                                                        { type: form.alarmType[i],unit: form.alarmUnit[i], time: form.alarmTime[i] }; 
     437                                                                        }) : [] 
     438                                                        }; 
     439                                                         
     440                                                        if(form.startDate){ 
     441                                                                var tzId =  DataLayer.get('schedulable', form.idEvent).timezone || User.preferences.timezone, 
     442                                                                formatString = ( typeof form.allDay !== "undefined" && !!form.allDay )? pref.dateFormat+" HH:mm" : pref.dateFormat + " " + pref.hourFormat; 
     443                                                                 
     444                                                                DataLayer.put('notification', { 
     445                                                                        participant: me.id, 
     446                                                                        type: 'suggestion', 
     447                                                                        startTime: Timezone.getDateUTC(Date.parseExact(form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ), tzId).getTime(), 
     448                                                                        endTime:  parseInt(Timezone.getDateUTC(Date.parseExact(form.endDate + ( !!form.allDay ? " 00:00": " "+$.trim(form.endHour)), formatString ), tzId).getTime()) + (!!form.allDay ? 86400000 : 0) , 
     449                                                                        allDay: ( !!form.allDay ? 1 : 0 ), 
     450                                                                        schedulable: form.idEvent 
     451                                                                }); 
     452                                                         
     453                                                        } 
     454                                                        return me; 
     455                                                }else return(null); 
     456                                        }; 
     457                                }) 
    366458                        } 
    367459                }); 
    368                  
    369460                return notArray ? res[0] : res; 
    370461    }, 
     
    381472        statusLabels = [ '', 'accepted', 'tentative', 'cancelled', 'unanswered', 'delegated' ]; 
    382473         
     474        var delegateAttendee = {}; 
     475         
    383476        for( var i = 0; i < statusLabels.length; i++ ) 
    384477                statusParticipants[ statusLabels[i] ] = 0; 
    385  
    386         var isOrganizer = 1; 
    387478         
    388479        var res = $.map(evtObj, function( objEvent ){                    
    389480                     
    390                         var participantInfo = {}, me = DataLayer.copy(User.me); 
     481                        var participantInfo = {}, delegatedFrom = {}, me = DataLayer.copy(User.me); 
     482                         
     483                        var constantAcl = function(acl){ 
     484                                var returns = {}; 
     485                                for (var i in constantsParticipant){ 
     486                                        returns[constantsParticipant[i]] = acl.indexOf(i) >= 0 ? true : false 
     487                                } 
     488                                return returns; 
     489                        }; 
    391490                                                 
    392491                    return { 
     
    406505                            endHour: dateCalendar.formatDate(Timezone.setDateTimezone(new Date(parseInt(objEvent.endTime)), objEvent.timezone, objEvent.calendar), User.preferences.hourFormat), 
    407506                            allDay: !!parseInt( objEvent.allDay ), 
    408           //                            attachments: this.decode( "attachment:detail", form ), 
     507                                attachments: $.map(objEvent.attachments || [], function( attachment, i ){ 
     508                                        var attach = DataLayer.get('schedulableToAttachment', attachment, false); 
     509                                        attach.name = attach.name.length < 10 ?  attach.name : ( attach.name.substr(0, 6) + attach.name.substr( attach.name.length-4, attach.name.length)); 
     510                                         
     511                                        return attach; 
     512                                }),                                              
    409513                            attendee: $.map(objEvent.participants || [], function( participant, i ){                                             
     514                                         
     515                                        if(delegateAttendee[participant]) 
     516                                                return(null); 
    410517                                         
    411518                                        var attend = DataLayer.get('participant', participant); 
     
    416523                                        if( attend.user.id ===  me.id ){ 
    417524                                            participantInfo.user = { 
     525                                                        id: attend.id, 
    418526                                                        status : attend.status, 
     527                                                        delegatedFrom: attend.delegatedFrom, 
     528                                                        acl: attend.acl, 
     529                                                        receiveNotification : attend.receiveNotification, 
    419530                                                        alarms : $.map(attend.alarms || [], function( alarm ){ 
    420531                                                                return DataLayer.get('alarm', alarm); 
     
    422533                                                }; 
    423534                                                me.id = attend.id; 
    424                                                 return(null); 
     535                                                return(null); 
    425536                                        }; 
    426537                                         
     
    429540                                                name: attend.user.name != 'false' ? attend.user.name : '', 
    430541                                                mail: attend.user.mail, 
    431                                                 isExternal: attend.isExternal 
     542                                                status : attend.status, 
     543                                                isExternal: attend.isExternal, 
     544                                                acl: attend.acl, 
     545                                                delegatedFrom: attend.delegatedFrom 
    432546                                        }; 
    433547                                         
     548                                        if(!!parseInt(attend.delegatedFrom)){ 
     549                                                delegatedFrom[attend.delegatedFrom] = DataLayer.copy(person); 
     550                                                return(null); 
     551                                        } 
     552                                         
    434553                                        if( !!parseInt(attend.isOrganizer )){ 
    435                                                 isOrganizer = ((attend.user.id == User.me.id) || (!!!attend.user)) ? 1 : 0; 
    436554                                            participantInfo.organizer = DataLayer.copy(person); 
    437555                                                return(null); 
     
    441559                                }), 
    442560                            organizer: participantInfo.organizer || me, 
    443                             alarms: !!participantInfo.user ?  participantInfo.user.alarms : [], 
    444                             status: !!participantInfo.user ? participantInfo.user.status :  1, 
    445                             me: me, 
    446                                 isOrganizer: isOrganizer, 
     561                            alarms: !!participantInfo.user ? participantInfo.user.alarms : [], 
     562                            status: !!participantInfo.user ? participantInfo.user.status : 1, 
     563                                acl: !!participantInfo.user ? constantAcl(participantInfo.user.acl) : constantAcl('rowi'), 
     564                            me: !!participantInfo.user ? DataLayer.merge(participantInfo.user, me) : DataLayer.merge(me, {acl: 'rowi', delegatedFrom: 0, receiveNotification: 1}), 
     565                                delegatedFrom: delegatedFrom, 
    447566                                statusParticipants: statusParticipants 
    448567                        }; 
    449                 }); 
    450  
     568                });      
    451569        return notArray ? res[0] : res; 
    452570    } 
     
    485603                              description: form.description, 
    486604                              timezone: tzId, 
     605                                  attachments: $.map(form.attachment || [], function( attachment, i ){ 
     606                                                return {attachment: attachment} 
     607                                  }), 
    487608                              participants: $.map( form.attendee || [], function( attendee, i ){ 
    488609 
     
    495616                                                if( participant.user === User.me.id ){ 
    496617                                                        return DataLayer.merge({ 
    497                                                                 isOrganizer: ( !i ? 1 : 0 ), 
     618                                                                id: attendee, 
     619                                                                isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ), 
     620                                                                acl: form.attendee_organizer == attendee ? (form.attendeeAcl[i].indexOf('o') < 0 ? form.attendeeAcl[i]+'o' : form.attendeeAcl[i]) : form.attendeeAcl[i].replace('o', ''), 
    498621                                                                alarms: participant.alarms = $.map( form.alarmTime || [], function( alarmTime, i ){ 
    499622                                                                                if( alarmTime === "" ) 
     
    502625                                                                                                                                        { type: form.alarmType[i],unit: form.alarmUnit[i], time: form.alarmTime[i] }; 
    503626                                                                        }), 
    504                                                                 status: form.status 
    505                                                         }, !!form.idEvent ? {id: attendee} : {user: participant.user});                                                  
     627                                                                status: !!form.status ? form.status : 3 
     628                                                                }, form.delegatedFrom[i] != '0' ? {delegatedFrom: form.delegatedFrom[i]} : {});                                                  
    506629                                                }else{ 
    507                                                         return { 
     630                                                        return DataLayer.merge({ 
    508631                                                                id: attendee, 
    509                                                                 isOrganizer: ( !i ? 1 : 0 ), 
    510                                                                 isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0 
    511                                                         }; 
     632                                                                acl: form.attendeeAcl[i], 
     633                                                                isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ), 
     634                                                                isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0, 
     635                                                                acl: form.attendee_organizer == attendee ? (form.attendeeAcl[i].indexOf('o') < 0 ? form.attendeeAcl[i]+'o' : form.attendeeAcl[i]) : form.attendeeAcl[i].replace('o', '') 
     636                                                        }, form.delegatedFrom[i] != '0' ? {delegatedFrom: form.delegatedFrom[i]} : {});  
    512637                                                }; 
    513638                                          }) 
     
    719844                        for(var i = 0; i < evt.participants.length; i++){ 
    720845                                attendee = DataLayer.get('participant', evt.participants[i]); 
    721                                 if(!!parseInt(attendee.isOrganizer)) 
    722846                                        if(attendee.user == User.me.id) 
    723                                                 return true; 
    724                                         else 
    725                                                 return false; 
     847                                                return (attendee.acl.indexOf('w') >= 0 || attendee.acl.indexOf('o') >= 0 ) ? true : false; 
    726848                        } 
    727849                } 
  • trunk/prototype/modules/calendar/js/helpers.js

    r5510 r5514  
    4545} 
    4646*/ 
     47 
    4748function eventDetails( objEvent, decoded, path) 
    4849{ 
     
    6970         */ 
    7071        zebraDiscardEventDialog = false; 
     72         
     73        /** 
     74                ACLs do participant 
     75        */ 
     76        acl_names = { 
     77                'w': 'acl-white', 
     78                'i': 'acl-invite-guests', 
     79                'p': 'acl-participation-required' 
     80        }; 
     81        /** 
     82        * callback de participantes generico 
     83        */ 
     84        var callbackAttendee = function(){ 
     85                //Cria qtip de permissões pelo click do checkbox 
     86                var checked = false; 
     87                blkAddAtendee.find("li.not-attendee").addClass('hidden'); 
     88         
     89                blkAddAtendee.find("li .button").filter(".close.new").button({ 
     90                        icons: { 
     91                                primary: "ui-icon-close" 
     92                        }, 
     93                        text: false 
     94                }).click(function () { 
     95                        DataLayer.remove('participant', $(this).parents('li').find('[type=checkbox]').val()); 
     96                        $(this).parents('li').remove(); 
     97                        if(blkAddAtendee.find(".attendee-list li").length == 1) 
     98                                blkAddAtendee.find("li.not-attendee").removeClass('hidden'); 
     99                }) 
     100                .addClass('tiny disable ui-button-disabled ui-state-disabled') 
     101                .removeClass('new').end() 
     102         
     103                .filter(".delegate.new").button({ 
     104                        icons: { 
     105                                primary: "ui-icon-transferthick-e-w" 
     106                        }, 
     107                        text: false 
     108                }).click(function () { 
     109                                                 
     110                        if($(this).hasClass('attendee-permissions-change-button')){ 
     111                                $(this).removeClass('attendee-permissions-change-button')    
     112                                .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end();                
     113                                 
     114                                $(this).parents('li').find('input[name="delegatedFrom[]"]').val(''); 
     115                                 
     116                                blkAddAtendee.find('.request-update').addClass('hidden'); 
     117                                blkAddAtendee.find('.status option').toggleClass('hidden'); 
     118                                 
     119                                 
     120                                blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change'); 
     121                                 
     122                        }else{ 
     123                                blkAddAtendee.find('.delegate').removeClass('attendee-permissions-change-button'); 
     124                                blkAddAtendee.find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change'); 
     125                         
     126                                $(this).addClass('attendee-permissions-change-button')    
     127                                .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end();                
     128                                $(this).parents('li').find('input[name="delegatedFrom[]"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val()); 
     129                         
     130                                blkAddAtendee.find('.request-update').removeClass('hidden'); 
     131                                if(blkAddAtendee.find('.status option.hidden').length == 1) 
     132                                        blkAddAtendee.find('.status option').toggleClass('hidden'); 
     133                         
     134                                blkAddAtendee.find('option[value=5]').attr('selected','selected').trigger('change'); 
     135                        } 
     136                }) 
     137                .addClass('tiny disable ui-button-disabled ui-state-disabled') 
     138                .removeClass('new').end() 
     139                 
     140                .filter(".edit.new").button({ 
     141                        icons: { 
     142                                primary: "ui-icon-key" 
     143                        }, 
     144                        text: false 
     145                }).click(function() { 
     146                         
     147                        if(!!!checked) 
     148                                $(this).parents('li').find('[type=checkbox]').attr('checked', (!$(this).parent().find('[type=checkbox]').is(':checked'))).end(); 
     149                         
     150                        var aclsParticipant =  $(this).parents('li').find('input[name="attendeeAcl[]"]').val(); 
     151                        checked = false; 
     152                         
     153                        if( $('.qtip.qtip-blue.qtip-active').val() !== ''){ 
     154                                blkAddAtendee.find('dd.attendee-list').qtip({ 
     155                                        show: {ready: true, solo: true, when: {event: 'click'}}, 
     156                                        hide: false, 
     157                                        content: { 
     158                                                text: $('<div></div>').html( DataLayer.render( 'templates/attendee_permissions.ejs', {} ) ),  
     159                                                title: { 
     160                                                        text:'Permissões',  
     161                                                        button: '<a class="button close" href="#">close</a>' 
     162                                                } 
     163                                        }, 
     164                                        style: {name: 'blue', tip: {corner: 'leftMiddle'}, border: {width: 4, radius: 8}, width: {min: 230, max:230}}, 
     165                                        position: { 
     166                                                corner: { 
     167                                                        target: 'rightMiddle', 
     168                                                        tooltip: 'leftMiddle' 
     169                                                }, 
     170                                                adjust: {x:0, y:0} 
     171                                        } 
     172                                }) 
     173                                .qtip("api").onShow = function(arg0) { 
     174                                        $('.qtip-active .button.close').button({ 
     175                                                icons: {primary: "ui-icon-close"}, 
     176                                                text: false 
     177                                        }) 
     178                                        .click(function(){ 
     179                                                blkAddAtendee.find('dd.attendee-list').qtip('destroy'); 
     180                                        }); 
     181                                         
     182                                        $('.qtip-active .button.save').button().click(function(){ 
     183                                                 
     184                                                var acl = ''; 
     185                                                $('.qtip-active').find('[type=checkbox]:checked').each(function(i, obj) { 
     186                                                        acl+= obj.value; 
     187                                                }); 
     188 
     189                                                blkAddAtendee.find('dd.attendee-list [type=checkbox]:checked').siblings('input[name="attendeeAcl[]"]').each(function(i, obj) {  
     190                                                        obj.value = 'r'+acl; 
     191                                                }).parents('li').find('.button.edit').addClass('attendee-permissions-change-button')    
     192                                                .find('.ui-icon-key').addClass('attendee-permissions-change');                
     193                                                 
     194                                                blkAddAtendee.find('dd.attendee-list [type=checkbox]').attr('checked', false); 
     195                                                 
     196                                                blkAddAtendee.find('dd.attendee-list').qtip('destroy'); 
     197                                         
     198                                        }); 
     199                                        $('.qtip-active .button.cancel').button().click(function(){ 
     200                                                blkAddAtendee.find('dd.attendee-list [type=checkbox]').attr('checked', false); 
     201                                                blkAddAtendee.find('dd.attendee-list').qtip('destroy'); 
     202                                        }); 
     203                                         
     204                                        if(aclsParticipant) 
     205                                                for(var i = 1; i < aclsParticipant.length; i++){ 
     206                                                        $('.qtip-active').find('input[name="'+acl_names[aclsParticipant.charAt(i)]+'"]').attr('checked', true); 
     207                                                } 
     208                                         
     209                                         
     210                                        $('.button').button(); 
     211                                         
     212                                }; 
     213                        }else{ 
     214                                if(!$('.new-event-win dd.attendee-list').find('[type=checkbox]:checked').length){ 
     215                                        blkAddAtendee.find('dd.attendee-list').qtip('destroy'); 
     216                                }else{ 
     217                                        $('.qtip-active .button.save .ui-button-text').html('Aplicar a todos') 
     218                                } 
     219                         
     220                        };                       
     221                }) 
     222                .addClass('tiny disable ui-button-disabled ui-state-disabled') 
     223                .removeClass('new').end() 
     224                 
     225                .filter(".open-delegate.new").click(function(){ 
     226                        if($(this).hasClass('ui-icon-triangle-1-e')){ 
     227                                $(this).removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s'); 
     228                                $(this).parents('li').find('.list-delegates').removeClass('hidden'); 
     229                        }else{ 
     230                                $(this).removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e'); 
     231                                $(this).parents('li').find('.list-delegates').addClass('hidden'); 
     232                        } 
     233                 
     234                }).removeClass('new'); 
     235         
     236         
     237                blkAddAtendee.find("li input[type=checkbox].new").click(function(){ 
     238                        if(!$('.new-event-win dd.attendee-list').find('[type=checkbox]:checked').length){ 
     239                                blkAddAtendee.find('dd.attendee-list').qtip('destroy'); 
     240                        }else{ 
     241                                checked = true; 
     242                                $(this).parents('li').find('.button.edit').click(); 
     243                                //$('.qtip-active .button.save .ui-button-text').html('Aplicar a todos') 
     244                        } 
     245                         
     246                        checked = true; 
     247                        $(this).parents('li').find('.button.edit').click(); 
     248                }).removeClass('new'); 
     249         
     250                UI.dialogs.addEvent.find('.attendees-list li').hover( 
     251                        function () { 
     252                                $(this).addClass("hover-attendee"); 
     253                                $(this).find('.button').removeClass('disable ui-button-disabled ui-state-disabled').end() 
     254                                .find('.attendee-options').addClass('hover-attendee'); 
     255                        }, 
     256                        function () { 
     257                                $(this).removeClass("hover-attendee"); 
     258                                $(this).find('.button').addClass('disable ui-button-disabled ui-state-disabled').end() 
     259                                .find('.attendee-options').removeClass('hover-attendee');; 
     260                        } 
     261                ); 
     262         
     263                 
     264        } 
    71265         
    72266        var html = DataLayer.render( path+'templates/event_add.ejs', {event:objEvent});  
     
    99293                                                                        if(clicked == 'Descartar alterações') { 
    100294                                                                                canDiscardEventDialog = true; 
     295                                                                                /** 
     296                                                                                *Remoção dos anexos do eventos caso seja cancelado a edição 
     297                                                                                */ 
     298                                                                                var ids = []; 
     299                                                                                $.each($('.attachment-list input'), function (i, input) { ids.push(input.value); }); 
     300                                                                                if(ids.length > 0) 
     301                                                                                        DataLayer.remove('attachment', {filter: ['IN', 'id', ids]}); 
     302                                                                                 
    101303                                                                                UI.dialogs.addEvent.dialog('close'); 
    102304                                                                        }else{ 
     
    256458                        canDiscardEventDialog = true; 
    257459                         
    258                         UI.dialogs.addEvent.children(".form-addevent").submit(); 
     460                        UI.dialogs.addEvent.children().find('form.form-addevent').submit(); 
    259461                        UI.dialogs.addEvent.dialog("close"); 
    260462            }).end() 
    261463                 
    262464                .children(".export").click(function(){ 
    263                         UI.dialogs.addEvent.children(".form-export").submit(); 
     465                        UI.dialogs.addEvent.children().find(".form-export").submit(); 
    264466            }); 
    265467 
     
    293495            }); 
    294496             
    295 //          UI.dialogs.addEvent.find('.button-add-attachment').click(function(){ 
    296 //                  var li_attach =  
    297 //                          '<li class="input_label">' +  
    298 //                                  '<input type="file" name="attachments[]"" />' + 
    299 //                          '</li>'; 
    300 //                  jQuery('.attachments-list').append(li_attach); 
    301 //          }); 
    302              
    303                 var attendeeHtml = DataLayer.render( path+'templates/attendee_add.ejs', {event:objEvent}); 
     497                  
     498                UI.dialogs.addEvent.find('.button.suggestion-hours').button({ 
     499                        icons: { 
     500                                primary: "ui-icon-clock" 
     501                        }, 
     502                        text: 'Sugerir horário' 
     503                }).click(function () { 
     504                        $(this).siblings('input').removeAttr('disabled') 
     505                        .end().parents().find('input[name="allDay"]').removeAttr('disabled');            
     506                }); 
     507 
     508                if(objEvent.me.id == User.me.id){ 
     509                        objEvent.me.id = DataLayer.put('participant', {user: objEvent.me.id, mail: objEvent.me.mail }); 
     510                        objEvent.organizer.id = objEvent.me.id; 
     511                } 
     512 
     513                var attendeeHtml = DataLayer.render( path+'templates/attendee_add.ejs', {event:objEvent});               
    304514         
    305515                        // load template of attendees 
    306516                        var blkAddAtendee = UI.dialogs.addEvent.find('#calendar_addevent_details6').append(attendeeHtml); 
    307                          
    308                         blkAddAtendee.find('li.attendee .button').addClass('small '+ (objEvent.isOrganizer == 1 ? '' : 'hidden')).button({text:false, icons: {primary:'ui-icon-close'}}).click(function () { 
    309                                 DataLayer.remove('participant', $(this).parent().find('[type=checkbox]').val()); 
    310                                 $(this).parent().remove(); 
    311                         }); 
     517                        if(objEvent.attendee.length) 
     518                                callbackAttendee(); 
     519                        /** 
     520                                Opções de delegação do participante/organizer 
     521                        */               
     522                        blkAddAtendee.find(".button.participant-delegate").button({ 
     523                                icons: { 
     524                                        primary: "ui-icon-transferthick-e-w" 
     525                                }, 
     526                                text: false 
     527                        }).click(function () { 
     528                                if($(this).hasClass('attendee-permissions-change-button')){ 
     529                                        if(!$(this).hasClass('disable')){ 
     530                                                $(this).removeClass('attendee-permissions-change-button')    
     531                                                .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end();                
     532                                                blkAddAtendee.find('.block-add-attendee.search').addClass('hidden'); 
     533                                                blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos'); 
     534                                        } 
     535                                }else{                                                                   
     536                                        $(this).addClass('attendee-permissions-change-button')    
     537                                        .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end();                
     538                                        blkAddAtendee.find('.block-add-attendee.search dt').html('Delegar participação para'); 
     539                                        blkAddAtendee.find('.block-add-attendee.search').removeClass('hidden'); 
     540                                        blkAddAtendee.find('.block-add-attendee.search input.search').focus(); 
     541                                } 
     542                        }) 
     543                        .addClass('tiny');               
     544                         
    312545                        //show or hidden permissions attendees 
    313546                        //blkAddAtendee.find('.block-attendee-list #attendees-users li').click(show_permissions_attendees);  
     
    481714                                                        user[0].id =  DataLayer.put('participant', {user: user[0].id, isExternal: isExternal}); 
    482715                                                        blkAddAtendee.find('dd.attendee-list ul.attendee-list').append( 
    483                                                                 DataLayer.render(path+'templates/participants_add_itemlist.ejs', user) 
     716                                                                DataLayer.render(path+'templates/participants_add_itemlist.ejs', {user:user, acl: objEvent.acl}) 
    484717                                                        ) 
    485                                                         .find('.button.close').addClass('small').button({text:false, icons:{primary:'ui-icon-close'}}).click(function() { 
    486                                                                 DataLayer.remove('participant', $(this).parent().find('[type=checkbox]').val()); 
    487                                                                 $(this).parent().remove(); 
    488                                                         }).end() 
    489718                                                        .scrollTo('max'); 
     719                                                        callbackAttendee(); 
    490720                                                } 
    491721                                                 
     
    503733                                                  
    504734                                                blkAddAtendee.find('dd.attendee-list ul.attendee-list').append( 
    505                                                         DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{id:newAttendeeId, name: newAttendeeName, mail: newAttendeeEmail, isExternal: 1}]) 
    506                                                 ).find('.button.close').addClass('small').button({text:false, icons:{primary:'ui-icon-close'}}).click(function() { 
    507                                                         DataLayer.remove('participant', $(this).parent().find('[type=checkbox]').val()); 
    508                                                         $(this).parent().remove(); 
    509                                                 }).end() 
    510                                                 .scrollTo('max'); 
    511  
     735                                                        DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{id:newAttendeeId, name: newAttendeeName, mail: newAttendeeEmail, isExternal: 1, acl: objEvent.acl}]) 
     736                                                ).scrollTo('max'); 
     737                                                callbackAttendee(); 
    512738 
    513739                                                /**  
     
    573799                                                        newAttendeeId = DataLayer.put('participant', {user: old_item.find('.id').html(), isExternal: 0}); 
    574800                                                        blkAddAtendee.find('dd.attendee-list ul.attendee-list') 
    575                                                         .append(DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{id: newAttendeeId, name: old_item.find('.name').html(), mail: old_item.find('.mail').html(), isExternal: 0}])) 
    576                                                         .find('.button').addClass('small').button({text:false, icons: {primary:'ui-icon-close'}}).click(function () { 
    577                                                                 $(this).parent().remove(); 
    578                                                         }).end() 
     801                                                        .append(DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{id: newAttendeeId, name: old_item.find('.name').html(), mail: old_item.find('.mail').html(), isExternal: 0, acl: objEvent.acl}])) 
    579802                                                        .scrollTo('max'); 
    580  
    581                                                         old_item.remove(); 
     803                                                        /** 
     804                                                        * Delegação de participação de um participante com permissão apenas de leitura 
     805                                                        * 
     806                                                        */ 
     807                                                        if(!objEvent.acl.organization && !objEvent.acl.write && !objEvent.acl.inviteGuests && objEvent.acl.read ){ 
     808                                                                 
     809                                                                blkAddAtendee.find('.block-add-attendee.search').addClass('hidden'); 
     810                                                                blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos'); 
     811                                                                 
     812                                                                blkAddAtendee.find('.status option').toggleClass('hidden'); 
     813                                                                blkAddAtendee.find('option[value=5]').attr('selected','selected').trigger('change'); 
     814                                                                blkAddAtendee.find('.request-update').removeClass('hidden'); 
     815 
     816                                                                blkAddAtendee.find('dd.attendee-list ul.attendee-list li .button.close').parents('li').find('input[name="delegatedFrom[]"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val()); 
     817                                                                 
     818                                                                blkAddAtendee.find('.me .participant-delegate').addClass('disable ui-button-disabled ui-state-disabled'); 
     819                                                                blkAddAtendee.find(".button.close").button({ 
     820                                                                        icons: { 
     821                                                                                primary: "ui-icon-close" 
     822                                                                        }, 
     823                                                                        text: false 
     824                                                                }).click(function () { 
     825                                                                         
     826                                                                        $(this).parents('li').find('input[name="delegatedFrom[]"]').val(''); 
     827                                                                        blkAddAtendee.find('.request-update').addClass('hidden'); 
     828                                                                        blkAddAtendee.find('.status option').toggleClass('hidden'); 
     829                                                                        blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change');                     
     830                                                                        blkAddAtendee.find('.me .participant-delegate').removeClass('disable ui-button-disabled ui-state-disabled attendee-permissions-change-button') 
     831                                                                        .find('.ui-icon-person').removeClass('attendee-permissions-change').end();                       
     832                                                                         
     833                                                                        DataLayer.remove('participant', $(this).parents('li').find('[type=checkbox]').val()); 
     834                                                                        $(this).parents('li').remove(); 
     835                                                                }) 
     836                                                                .addClass('tiny'); 
     837                                                        }else{ 
     838                                                                callbackAttendee(); 
     839                                                                old_item.remove(); 
     840                                                        } 
    582841                                                } 
    583842                                        }); 
     
    586845                                } 
    587846                        }); 
    588  
    589 /* 
    590                         UI.dialogs.addEvent.find('.attendees-list li').hover( 
    591                                 function () { 
    592                                         $(this).addClass("hover"); 
    593                                 }, 
    594                                 function () { 
    595                                         $(this).removeClass("hover"); 
     847                        //$('.block-add-attendee .search-result-list').selectable(); 
     848 
     849                UI.dialogs.addEvent.find('.row.fileupload-buttonbar .button').filter('.delete').button({ 
     850                        icons: { 
     851                                primary: "ui-icon-close" 
     852                        }, 
     853                                text: 'Excluir' 
     854                        }).click(function () { 
     855                                $('.row.fileupload-buttonbar .attachments-list p').remove(); 
     856                                 
     857                                var ids = []; 
     858                                $.each($('.attachment-list input'), function (i, input) { ids.push(input.value); }); 
     859                                if(ids.length > 0){ 
     860                                        DataLayer.remove('attachment', {filter: ['IN', 'id', ids]}); 
     861                                        $('.attachment-list input').remove(); 
    596862                                } 
    597                         ); 
    598 */ 
    599                         //$('.block-add-attendee .search-result-list').selectable(); 
    600  
    601                         UI.dialogs.addEvent.find('.block-attendee-list select.status').change(function(){ 
    602                                 if ($(this).val() == 'another') { 
    603         //                              jQuery('.block-attendee-list .add-attendee-search').removeClass('hidden'); 
    604                                         $(this).qtip({ 
    605                                                 show: {ready: true}, 
    606                                                 hide: false, 
    607                                                 content: { 
    608                                                         text: $('.block-attendee-list .add-attendee-search').clone().removeClass('hidden'),  
    609                                                         title: { 
    610                                                                 text:'Indique o participante',  
    611                                                                 button: '<a class="button close" href="#">close</a>' 
    612                                                         } 
    613                                                 }, 
    614                                                 style: {name: 'blue', tip: {corner: 'leftMiddle'}, border: {width: 4, radius: 8}, width: {min: 250, max:250}}, 
    615                                                 position: { 
    616                                                         corner: { 
    617                                                                 target: 'rightMiddle', 
    618                                                                 tooltip: 'leftMiddle' 
    619                                                         }, 
    620                                                         adjust: {x:0, y:0} 
    621                                                 } 
    622                                         }) 
    623                                         $(this).qtip.onShow = function() { 
    624                                                 $('.qtip .button.close').button({ 
    625                                                         icons: {primary: "ui-icon-close"}, 
    626                                                         text: false 
    627                                                 }); 
    628                                         } 
    629                                 } else { 
    630         //                              jQuery('.block-attendee-list .add-attendee-search').addClass('hidden'); 
    631                                 } 
    632                         }); 
    633                 UI.dialogs.addEvent.find(':input').change(function(event){ 
    634                         if (event.keyCode != '27' && event.keyCode != '13') 
    635                                 canDiscardEventDialog = false; 
    636                 }).keydown(function(event){ 
    637                         if (event.keyCode != '27' && event.keyCode != '13') 
    638                                 canDiscardEventDialog = false; 
     863                }).end() 
     864                .filter('.close').button({ 
     865                        icons: { 
     866                                primary: "ui-icon-close" 
     867                        }, 
     868                                text: false 
     869                        }).click(function () { 
     870                                DataLayer.remove('attachment', $(this).parents('p').find('input[name="fileId[]"]').val()); 
     871                                $(this).parents('p').remove(); 
     872                }).end() 
     873                .filter('.downlaod-archive').button({ 
     874                        icons: { 
     875                                primary: "ui-icon-arrowthickstop-1-s" 
     876                        }, 
     877                                text: false 
    639878                }); 
     879                 
     880        $('#fileupload').fileupload({ 
     881                sequentialUploads: true, 
     882                add: function (e, data) { 
     883                        if(data.files[0].size < 30000000) 
     884                                data.submit(); 
     885                }, 
     886                change: function (e, data) { 
     887                        $.each(data.files, function (index, file) { 
     888                                var attach = {}; 
     889                                attach.fileName = file.name; 
     890                                if(file.name.length > 10) 
     891                                        attach.fileName = file.name.substr(0, 6) + file.name.substr(file.name.length-4, file.name.length); 
     892                                attach.fileSize = file.size; 
     893                                if(file.size > 30000000) 
     894                                        attach.error = 'Tamanho de arquivo nao permitido!!' 
     895                                 
     896                                $('.attachments-list').append(DataLayer.render(path+'templates/attachment_add_itemlist.ejs', {file : attach})); 
     897                                 
     898                                if(file.size < 30000000){ 
     899                                        $('.fileinput-button.new').append(data.fileInput[0]).removeClass('new'); 
     900                                        $('.attachments-list').find('[type=file]').addClass('hidden'); 
     901                                         
     902                                }else 
     903                                        $('.fileinput-button.new').removeClass('new'); 
     904                                 
     905                                 
     906                                $('.attachments-list').find('.button.close').button({ 
     907                                        icons: { 
     908                                                primary: "ui-icon-close" 
     909                                        }, 
     910                                        text: false 
     911                                }).click(function(){ 
     912                                        var idAttach = $(this).parent().find('input[name="fileId[]"]').val(); 
     913                                        $('.attachment-list').find('input[value="'+idAttach+'"]') 
     914                                        $(this).parent().remove(); 
     915                                });      
     916                                 
     917                })}, 
     918                progress: function(e, data){ 
     919                        var value = parseInt(data.loaded / data.total * 100, 10); 
     920                        $('.progress.in-progress:first').removeClass('hidden') 
     921                        $('.progress.in-progress:first').progressbar({ 
     922                                value: value 
     923                        }); 
     924                         
     925                        if(value == 100){ 
     926                                $('.progress.in-progress:first').removeClass('in-progress').addClass('on-complete').fadeOut('slow'); 
     927                        } 
     928                                 
     929                }, 
     930                done: function(e, data){ 
     931                        if(!!data.result && data.result != "[]"){ 
     932                                var newAttach = jQuery.parseJSON(data.result); 
     933                                $('.attachment-list').append('<input tyepe="hidden" name="attachment[]" value="'+newAttach['attachment'][0][0].id+'"/>'); 
     934                                $('.progress.on-complete:first').removeClass('on-complete').parents('p') 
     935                                .append('<input type="hidden" name="fileId[]" value="'+newAttach['attachment'][0][0].id+'"/>') 
     936                                .find('.status-upload').addClass('ui-icon ui-icon-check'); 
     937                        }else 
     938                                $('.progress.on-complete:first').removeClass('on-complete').parents('p').find('.status-upload').addClass('ui-icon ui-icon-cancel'); 
     939                                 
     940                        console.log("oi doen"); 
     941                } 
     942        }); 
     943                $('.attachments-list .button').button(); 
     944                 
     945                 
     946                 
     947        $('#fileupload').bind('fileuploadstart', function () { 
     948                var widget = $(this), 
     949        progressElement = $('#fileupload-progress').fadeIn(), 
     950        interval = 500, 
     951        total = 0, 
     952        loaded = 0, 
     953        loadedBefore = 0, 
     954        progressTimer, 
     955        progressHandler = function (e, data) { 
     956            loaded = data.loaded; 
     957            total = data.total; 
     958        }, 
     959        stopHandler = function () { 
     960            widget 
     961                .unbind('fileuploadprogressall', progressHandler) 
     962                .unbind('fileuploadstop', stopHandler); 
     963            window.clearInterval(progressTimer); 
     964            progressElement.fadeOut(function () { 
     965                progressElement.html(''); 
     966            }); 
     967        }, 
     968        formatTime = function (seconds) { 
     969            var date = new Date(seconds * 1000); 
     970            return ('0' + date.getUTCHours()).slice(-2) + ':' + 
     971                ('0' + date.getUTCMinutes()).slice(-2) + ':' + 
     972                ('0' + date.getUTCSeconds()).slice(-2); 
     973        }, 
     974        formatBytes = function (bytes) { 
     975            if (bytes >= 1000000000) { 
     976                return (bytes / 1000000000).toFixed(2) + ' GB'; 
     977            } 
     978            if (bytes >= 1000000) { 
     979                return (bytes / 1000000).toFixed(2) + ' MB'; 
     980            } 
     981            if (bytes >= 1000) { 
     982                return (bytes / 1000).toFixed(2) + ' KB'; 
     983            } 
     984            return bytes + ' B'; 
     985        }, 
     986        formatPercentage = function (floatValue) { 
     987            return (floatValue * 100).toFixed(2) + ' %'; 
     988        }, 
     989        updateProgressElement = function (loaded, total, bps) { 
     990            progressElement.html( 
     991                formatBytes(bps) + 'ps | ' + 
     992                    formatTime((total - loaded) / bps) + ' | ' + 
     993                    formatPercentage(loaded / total) + ' | ' + 
     994                    formatBytes(loaded) + ' / ' + formatBytes(total) 
     995            ); 
     996        }, 
     997        intervalHandler = function () { 
     998            var diff = loaded - loadedBefore; 
     999            if (!diff) { 
     1000                return; 
     1001            } 
     1002            loadedBefore = loaded; 
     1003            updateProgressElement( 
     1004                loaded, 
     1005                total, 
     1006                diff * (1000 / interval) 
     1007            ); 
     1008        }; 
     1009                widget 
     1010                        .bind('fileuploadprogressall', progressHandler) 
     1011                        .bind('fileuploadstop', stopHandler); 
     1012                progressTimer = window.setInterval(intervalHandler, interval); 
     1013        }); 
     1014                 
     1015        UI.dialogs.addEvent.find(':input').change(function(event){ 
     1016                if (event.keyCode != '27' && event.keyCode != '13') 
     1017                        canDiscardEventDialog = false; 
     1018        }).keydown(function(event){ 
     1019                if (event.keyCode != '27' && event.keyCode != '13') 
     1020                        canDiscardEventDialog = false; 
     1021        });      
     1022                 
    6401023                 
    6411024                UI.dialogs.addEvent.dialog('open'); 
  • trunk/prototype/modules/calendar/templates/alarms_add_itemlist.ejs

    r5376 r5514  
    1717                        <input type="hidden" name="isDefaultAlarm[]" value="<%=data.alarm.useAlarmDefault ? 1 : 0%>" /> 
    1818                        <label> antes de cada evento.</label> 
    19                         <a class="button remove small"></a> 
     19                        <a class="button remove tiny"></a> 
    2020                </li> 
    2121        <%} 
     
    3636                <input type="hidden" name="alarmId[]" value="" /> 
    3737                <label> antes de cada evento.</label> 
    38                 <a class="button remove small"></a> 
     38                <a class="button remove tiny"></a> 
    3939        </li> 
    4040<%}%> 
  • trunk/prototype/modules/calendar/templates/attendee_add.ejs

    r5437 r5514  
     1        <%var iconStatus = ['','ui-icon-check', 'ui-icon-radio-off', 'ui-icon-close', 'ui-icon-help', 'ui-icon-transferthick-e-w', 'ui-icon-contact'] 
     2          var legendStatus = ['','Confirmado','Tentativa','Cancelado','Sem Resposta','Delegado', 'Participante'] 
     3        %> 
    14        <dl class="block-attendee-list attendees-list"> 
    25                <dt class="me"><%= data.event.me.name %></dt> 
    36                <dd class="me"> 
    47                        <select class="status" name="status"> 
    5                                 <option value="1" <%= data.event.status=='1' ? 'selected="selected"':'' %>>Eu vou</option> 
    6                                 <option value="3" <%= data.event.status=='3' ? 'selected="selected"':'' %>>Eu não vou</option> 
    7                                 <option value="2" <%= data.event.status=='2' ? 'selected="selected"':'' %>>Talvez</option> 
    8 <!--                            <option value="another">Outra pessoa vai</option>--> 
     8                                <%if(!data.event.delegatedFrom[data.event.me.id]){%> 
     9                                        <option value="1" <%= data.event.status=='1' ? 'selected="selected"':'' %>>Eu vou</option> 
     10                                        <%if(!data.event.acl.participationRequired){%> 
     11                                                <option value="3" <%= data.event.status=='3' ? 'selected="selected"':'' %>>Eu não vou</option> 
     12                                                <option value="2" <%= data.event.status=='2' ? 'selected="selected"':'' %>>Talvez</option> 
     13                                                <option class="hidden" value="5">Delegado</option> 
     14                                        <%}%> 
     15                                <%}else{%> 
     16                                        <option value="5" 'selected="selected"'>Delegado</option> 
     17                                <%}%> 
    918                        </select> 
    10                         <%if(data.event.organizer.id != data.event.me.id){%> 
    11                             <input type="hidden" name="meId" value="<%=data.event.me.id%>"> 
    12                         <%}%> 
    13                         <fieldset class="add-attendee-search search-field ui-corner-all hidden"> 
    14                                 <span class="ui-icon ui-icon-search"></span> 
    15                                 <input class="search" type="text" /> 
    16                         </fieldset> 
     19                        <% if (!data.event.acl.organization && !data.event.acl.write && !data.event.acl.inviteGuests && !data.event.acl.participationRequired && !data.event.delegatedFrom[data.event.me.id] ) { %> 
     20                                <fieldset class="add-attendee-options-read"> 
     21                                        <a href="#" class="button participant-delegate add-attendee-options-button">Delegar participação a um novo participante</a> 
     22                                </fieldset> 
     23                        <% } %> 
     24                         
     25                        <p class="input-group request-update <%=data.event.delegatedFrom[data.event.me.id] ? '' : "hidden"%>"> 
     26                                <input type="checkbox" name="receiveNotification" value="true" <%=data.event.me.receiveNotification=='1' ? 'checked="checked"' : ''%>/> 
     27                                <label for="request-update">Receber atualizações</label> 
     28                        </p> 
     29                         
     30                        <input type="hidden" name="delegatedFrom[]" value="<%=data.event.me.delegatedFrom%>"> 
     31                 
     32                        <input type="hidden" name="attendee[]" value="<%=data.event.me.id%>"> 
     33                        <input type="hidden" name="attendeeType[]" value="0"> 
     34                        <input type="hidden" name="attendeeAcl[]" value="<%=data.event.me.acl%>">                                
     35                         
    1736                </dd> 
    1837 
     
    2039                <dd class="attendee-list"> 
    2140                        <ul class="attendee-list"> 
    22                                 <li class="organizer <%= data.event.organizer.id == data.event.me.id ? "hidden" : ''%>">  
     41                                <li class="organizer <%= (data.event.acl.organization) ? "hidden" : "" %>">  
    2342                                        <div style="overflow:hidden; width:100%; display:table;"> 
    24                                                 <input type="checkbox" value="<%= data.event.organizer.id %>" disabled="disabled"> 
    25                                                 <input type="hidden" name="attendee[]" value="<%=data.event.organizer.id%>"> 
    26                                                 <input type="hidden" name="attendeeType[]" value="0"> 
    27                                                 <input type="hidden" name="attendee_organizer[]" value="<%=data.event.organizer.id%>"> 
    28                                                 <label for="attendee_organizer" title="<%= data.event.organizer.name ? data.event.organizer.name: '' %>" class="name"><%= data.event.organizer.name ? data.event.organizer.name : '' %></label> 
    29                                                 <label for="attendee_organizer" title="<%= data.event.organizer.mail ? data.event.organizer.mail: '' %>" class="mail"><%= data.event.organizer.mail ? data.event.organizer.mail : '' %></label> 
    30                                                 <% if (data.event.me.id == data.event.organizer.id && false) { %> 
    31                                                 <span class="button small swap">Mudar organizador</span> 
    32                                                 <% } %> 
     43                                                <span class="space-status ui-icon <%=iconStatus[data.event.organizer.status]%>" title="<%=legendStatus[data.event.organizer.status]%>"></span> 
     44                                                <span class="space-special ui-icon ui-icon-person" title="Organizador"></span> 
     45                                                <% if (!data.event.acl.organization && (data.event.organizer.id != data.event.me.id )) { %> 
     46                                                        <input type="checkbox" value="<%= data.event.organizer.id %>" disabled="disabled"> 
     47                                                        <input type="hidden" name="attendee[]" value="<%=data.event.organizer.id%>"> 
     48                                                        <input type="hidden" name="attendeeType[]" value="0"> 
     49                                                        <input type="hidden" name="attendeeAcl[]" value="<%=data.event.organizer.acl%>"> 
     50                                                        <input type="hidden" name="delegatedFrom[]" value="<%=data.event.organizer.delegatedFrom%>"> 
     51                                                <%}%> 
     52                                                <input type="hidden" name="attendee_organizer" value="<%=data.event.organizer.id%>"> 
     53                                                <label for="attendee_organizer" title="<%= data.event.organizer.name ? data.event.organizer.name: '' %>" class="name name-special"><%= data.event.organizer.name ? data.event.organizer.name : '' %></label> 
     54                                                <label for="attendee_organizer" title="<%= data.event.organizer.mail ? data.event.organizer.mail: '' %>" class="mail name-special"><%= data.event.organizer.mail ? data.event.organizer.mail : '' %></label> 
    3355                                        </div> 
    34                                 </li>            
    35                                  
    36                         <% if (data.event && data.event.attendee) { 
    37                                 for (var i=0; i< data.event.attendee.length; i++) { 
    38                         %> 
    39                                 <li class="attendee">  
     56                                </li> 
     57                        <%if(!!data.event.delegatedFrom[data.event.me.id]){ 
     58                                var delegated_me = data.event.delegatedFrom[data.event.me.id]%> 
     59                                <li class="me-delegated"> 
    4060                                        <div style="overflow:hidden; width:100%; display:table;"> 
    41                                                 <input type="checkbox" value="<%= data.event.attendee[i].id %>" disabled="disabled"> 
    42                                                 <input type="hidden" name="attendee[]" value="<%=data.event.attendee[i].id%>"> 
    43                                                 <input type="hidden" name="attendeeType[]" value="<%=data.event.attendee[i].isExternal%>"> 
    44                                                 <label title="<%= data.event.attendee[i].name ? data.event.attendee[i].name: '' %>" class="name"><%= data.event.attendee[i].name ? data.event.attendee[i].name : '' %></label> 
    45                                                 <label title="<%= data.event.attendee[i].mail ? data.event.attendee[i].mail : '' %>" class="mail"><%= data.event.attendee[i].mail ? data.event.attendee[i].mail : '' %></label> 
    46                                                 <span class="ui-icon ui-icon-close ui-corner-all ui-icon-float-right"></span> 
    47                                         </div>  
    48                                         <a class="button close">X</a> 
     61                                                <span class="space-status ui-icon <%=iconStatus[delegated_me.status]%>" title="<%=legendStatus[delegated_me.status]%>"></span> 
     62                                                <span class="space-special ui-icon <%=iconStatus[5]%>" title="Delegado para"></span> 
     63                                                <input type="checkbox" value="<%= delegated_me.id%>" disabled="disabled"> 
     64                                                <label for="me-delegated" title="<%= delegated_me.name ? delegated_me.name: '' %>" class="name name-special"><%= delegated_me.name ? delegated_me.name : '' %></label> 
     65                                                <label for="me-delegated" title="<%= delegated_me.mail ? delegated_me.mail: '' %>" class="mail name-special"><%= delegated_me.mail ? delegated_me.mail : '' %></label> 
     66                                        </div> 
    4967                                </li> 
    50                                  
    51                                  
    52                                  
    53                         <%       
    54                                 }  
    55                         } else { %> 
    56                                 <li>Não há outros participantes.</li> 
     68                        <%}%> 
     69                        <% if (data.event && data.event.attendee.length > 0) { 
     70                                for (var i=0; i< data.event.attendee.length; i++) {%> 
     71                                        <li class="attendee">  
     72                                                <div style="overflow:hidden; width:100%; display:table;"> 
     73                                                        <%if(data.event.delegatedFrom[data.event.attendee[i].id]){%> 
     74                                                                <span class="open-delegate new ui-icon ui-icon-triangle-1-e"></span> 
     75                                                        <%}else{%> 
     76                                                                <span class="space-status ui-icon <%=iconStatus[data.event.attendee[i].status]%>" title="<%=legendStatus[data.event.attendee[i].status]%>"></span> 
     77                                                        <%}%> 
     78                                                        <span class="space-special ui-icon <%= !!data.event.delegatedFrom[data.event.attendee[i].id] ? iconStatus[5] : iconStatus[6]%>" title="<%=!!data.event.delegatedFrom[data.event.attendee[i].id] ? legendStatus[5] : legendStatus[6]%>"></span> 
     79                                                        <%if(data.event.acl.organization || data.event.acl.write){%> 
     80                                                                <input type="checkbox" value="<%= data.event.attendee[i].id %>"> 
     81                                                        <%}else{%> 
     82                                                                <input type="checkbox" value="<%= data.event.attendee[i].id%>" disabled="disabled"> 
     83                                                        <%}%> 
     84                                                        <input type="hidden" name="attendee[]" value="<%=data.event.attendee[i].id%>"> 
     85                                                        <input type="hidden" name="attendeeType[]" value="<%=data.event.attendee[i].isExternal%>"> 
     86                                                        <input type="hidden" name="attendeeAcl[]" value="<%=data.event.attendee[i].acl%>"> 
     87                                                        <input type="hidden" name="delegatedFrom[]" value="<%=data.event.attendee[i].delegatedFrom%>"> 
     88                                                        <label title="<%= data.event.attendee[i].name ? data.event.attendee[i].name: '' %>" class="name <%= !!data.event.delegatedFrom[data.event.attendee[i].id] ? "name-special-delegated" : "name-special" %>"><%= data.event.attendee[i].name ? data.event.attendee[i].name : '' %></label> 
     89                                                        <label title="<%= data.event.attendee[i].mail ? data.event.attendee[i].mail : ''%>" class="mail <%= !!data.event.delegatedFrom[data.event.attendee[i].id] ? "name-special-delegated" : "name-special"%>"><%= data.event.attendee[i].mail ? data.event.attendee[i].mail : '' %></label> 
     90                                                        <span class="ui-icon ui-icon-close ui-corner-all ui-icon-float-right"></span> 
     91                                                </div>  
     92                                                <div class="attendee-options"> 
     93                                                        <%if(data.event.acl.organization || data.event.acl.write){%> 
     94                                                                <a class="button edit attendee-options-button-edit new">Editar permissões</a> 
     95                                                                <a class="button close new">Remover</a> 
     96                                                        <%}%> 
     97                                                </div> 
     98 
     99 
     100                                                <%if(!!data.event.delegatedFrom[data.event.attendee[i].id]){%> 
     101                                                        <%var attendee = data.event.delegatedFrom[data.event.attendee[i].id]%> 
     102                                                        <% while(attendee != 0){%> 
     103                                                                <div class="list-delegates hidden"> 
     104                                                                        <div style="overflow:hidden; width:100%; display:table;"> 
     105                                                                                <span class="status-delegate ui-icon <%=iconStatus[attendee.status]%>" title="<%=legendStatus[attendee.status]%>"></span> 
     106                                                                                <span class="space-special-delegated ui-icon <%= !!data.event.delegatedFrom[attendee.id] ? iconStatus[5] : iconStatus[6]%>" title="<%=!!data.event.delegatedFrom[attendee.id] ? legendStatus[5] : legendStatus[6]%>"></span> 
     107                                                                                <input type="hidden" name="attendee[]" value="<%=attendee.id%>"> 
     108                                                                                <input type="hidden" name="attendeeType[]" value="<%=attendee.isExternal%>"> 
     109                                                                                <input type="hidden" name="attendeeAcl[]" value="<%=attendee.acl%>"> 
     110                                                                                <input type="hidden" name="delegatedFrom[]" value="<%=attendee.delegatedFrom%>"> 
     111                                                                                <label title="<%= attendee.name ? attendee.name : '' %>" class="name <%=attendee.status == 5 ? "name-status-delegated-delegated" : "name-status-delegated-none"%>"><%= attendee.name ? attendee.name : '' %></label> 
     112                                                                                <label title="<%= attendee.mail ? attendee.mail : '' %>" class="mail <%=attendee.status == 5 ? "name-status-delegated-none" : "name-status-delegated-none"%>"><%= attendee.mail ? attendee.mail : '' %></label> 
     113                                                                                <span class="ui-icon ui-icon-close ui-corner-all ui-icon-float-right"></span> 
     114                                                                        </div>  
     115                                                                </div> 
     116                                                                <%attendee = !!data.event.delegatedFrom[attendee.id] ? data.event.delegatedFrom[attendee.id] : 0%> 
     117                                                        <%}%> 
     118                                                <%}%> 
     119                                                 
     120 
     121                                        </li>    
     122                                <%}  
     123                        } else if(data.event.me.id == data.event.organizer.id && !(data.event.attendee.length > 0) ) { %> 
     124                                <li class="not-attendee">Não há outros participantes.</li> 
    57125                        <% } %> 
    58126                        </ul> 
     
    86154                 
    87155        </dl> 
    88 <% if (data.event.isOrganizer == 1) { %> 
    89         <dl class="block-add-attendee"> 
    90                 <dt class="add-attendee">Adicionar convidados</dt> 
    91                 <dd class="add-attendee"> 
    92                         <fieldset class="block-add-attendee" title="Participantes"> 
    93                                 <fieldset class="add-attendee-search search-field ui-corner-all"> 
    94                                         <span class="ui-icon ui-icon-search"></span> 
    95                                         <input class="search" type="text" /> 
    96                                 </fieldset> 
    97                                 <ul class="search-result-list ui-corner-all"> 
     156<% var isSearch = (data.event.acl.organization || data.event.acl.write || data.event.acl.inviteGuests) ? '' : 'hidden' %> 
     157<dl class="block-add-attendee search <%=isSearch%>"> 
     158        <dt class="add-attendee search">Adicionar outros convidados</dt> 
     159        <dd class="add-attendee"> 
     160                <fieldset class="block-add-attendee" title="Participantes"> 
     161                        <fieldset class="add-attendee-search search-field ui-corner-all"> 
     162                                <span class="ui-icon ui-icon-search"></span> 
     163                                <input class="search" type="text" /> 
     164                        </fieldset> 
     165                        <ul class="search-result-list ui-corner-all"> 
    98166 
    99                                 </ul> 
     167                        </ul> 
    100168 
    101                         </fieldset> 
     169                </fieldset> 
     170        </dd> 
     171</dl> 
    102172 
    103                         <fieldset class="block-add-attendee-permissions ui-corner-all hidden"> 
    104                                 <legend>Convidados podem:</legend> 
    105                                 <ul class="add-attendee-permissions-list"> 
    106                                         <li><input type="checkbox" name="attendee-mod-event"><label for="attendee-mod-event">Modificar evento </label></li> 
    107                                         <li><input type="checkbox" name="attendee-invite-others"><label for="attendee-invite-others">Convidar outros</label></li> 
    108                                         <li><input type="checkbox" name="attendee-view-list-invited"><label for="attendee-view-list-invited">Ver lista de convidados</label></li> 
    109                                         <li><input type="checkbox" name="attendee-optional"><label for="attendee-optional">Participação opcional</label></li> 
    110                                 </ul> 
    111                         </fieldset> 
    112                 </dd> 
    113         </dl> 
    114 <% } %> 
  • trunk/prototype/modules/calendar/templates/event_add.ejs

    r5511 r5514  
    1 <!--<div title="Criar Evento" class="new-event-win active"> --> 
    2     <form method="POST" action="<%=((data.event.isOrganizer == 0) && (data.event.id)) ? "schedulable:preview" : "schedulable:detail"%>" class="form-addevent content"> 
     1<div title="Criar Evento" class="div-addevent content"> 
     2    <form method="POST" action="<%=(data.event.acl.organization || data.event.acl.write) ?  "schedulable:detail" : "schedulable:preview"%>" class="form-addevent content"> 
    33 
    44        <fieldset id="calendar_addevent_details1"> 
    55                <legend class="hidden">Detalhes do evento</legend> 
    66                <p class="input-group"> 
    7                         <input type="text" class="h1" name="summary" <%= (data.event.isOrganizer == 0) ? 'disabled="disabled"' : '' %> value="<%= (data.event.summary) ? data.event.summary : '' %>"/> 
     7                        <input type="text" class="h1" name="summary" <%=(data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> value="<%= (data.event.summary) ? data.event.summary : '' %>"/> 
    88                        <% if( data.event.id ){ %> 
    99                                <input type="hidden" class="id-event" name="idEvent" value="<%= data.event.id %>"/> 
     
    1111                </p> 
    1212                <p class="input-group date-info"> 
    13                         <input type="text" class="date start-date" value="<%= (data.event.startDate) ? data.event.startDate : '' %>" <%= (data.event.isOrganizer == 0) ? 'disabled="disabled"' : '' %> name="startDate" /> 
    14                         <input type="text" class="time start-time<%= (data.event.allDay) ? ' hidden' : '' %>" value="<%= (data.event.startHour) ? data.event.startHour : '' %>" <%= (data.event.isOrganizer == 0) ? 'disabled="disabled"' : '' %> name="startHour" />  
     13                        <input type="text" class="date start-date" value="<%= (data.event.startDate) ? data.event.startDate : '' %>" <%=(data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> name="startDate" /> 
     14                        <input type="text" class="time start-time<%= (data.event.allDay) ? ' hidden' : '' %>" value="<%= (data.event.startHour) ? data.event.startHour : '' %>" <%= (data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> name="startHour" />  
    1515                        <span>até</span> 
    16                         <input type="text" class="date end-date" value="<%= (data.event.endDate) ? data.event.endDate : '' %>" <%= (data.event.isOrganizer == 0) ? 'disabled="disabled"' : '' %> name="endDate" /> 
    17                         <input type="text" class="time end-time<%= (data.event.allDay) ? ' hidden' : '' %>" value="<%= (data.event.endHour) ? data.event.endHour : '' %>" <%= (data.event.isOrganizer == 0) ? 'disabled="disabled"' : '' %> name="endHour" /> 
    18  
    19                         <a href="#" class="calendar_addevent_details_lnk_timezone">Fuso horário</a> 
     16                        <input type="text" class="date end-date" value="<%= (data.event.endDate) ? data.event.endDate : '' %>" <%= (data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> name="endDate" /> 
     17                        <input type="text" class="time end-time<%= (data.event.allDay) ? ' hidden' : '' %>" value="<%= (data.event.endHour) ? data.event.endHour : '' %>" <%=(data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> name="endHour" /> 
     18 
     19                        <a href="#" class="calendar_addevent_details_lnk_timezone <%=((!data.event.acl.organization || !data.event.acl.write) && (data.event.id)) ? "hidden" : '' %>">Fuso horário</a> 
    2020<!--                    <input type="text" name="timezone" style="display: none;" />--> 
    2121                        <select name="timezone" class="hidden calendar-addevent-details-txt-timezone"> 
     
    2525                                <% } %> 
    2626                        </select> 
    27                 </p> 
    28                  
     27                         
     28                        <a class="button suggestion-hours small <%=(data.event.acl.organization || data.event.acl.write) ? "hidden" : '' %>" href="#">Sugerir horário</a> 
     29                         
     30                </p> 
     31                                 
    2932                <div class="ui-widget messages-validation hidden"> 
    3033                        <div style="padding: 0.2em 0.7em;" class="ui-state-error ui-corner-all">  
     
    3740                 
    3841                <p class="input-group event-type"> 
    39                         <input type="checkbox" name="allDay" value="true" <%= (data.event.isOrganizer == 0) ? 'disabled="disabled"' : '' %> <%= (data.event.allDay) ? 'checked="checked"' : '' %>/> 
     42                        <input type="checkbox" name="allDay" value="true" <%= (data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> <%= (data.event.allDay) ? 'checked="checked"' : '' %>/> 
    4043                        <label for="allDay">Dia inteiro</label> 
    4144<!-- 
     
    4851<!--            <li><a href="#calendar_addevent_details3">Repetir</a></li>--> 
    4952                <li><a href="#calendar_addevent_details4">Lembretes</a></li> 
    50 <!--            <li><a href="#calendar_addevent_details4" style="color:#BBB;">Anexos</a></li>--> 
     53                <li><a href="#calendar_addevent_details5">Anexos</a></li> 
    5154                <li><a href="#calendar_addevent_details6">Participantes</a></li> 
    5255        </ul> 
     
    5558                <p class="input-group event-info"> 
    5659                        <label for="calendar_addevent_details_txt_local">Onde</label> 
    57                         <input type="text" name="location" <%= (data.event.isOrganizer == 0) ? 'disabled="disabled"' : '' %> value="<%= (data.event) ? data.event.location : '' %>"/> 
     60                        <input type="text" name="location" <%=(data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> value="<%= (data.event) ? data.event.location : '' %>"/> 
    5861                </p> 
    5962 
    6063                <p class="input-group"> 
    6164                        <label for="calendar_addevent_details_txtarea_description" class="for-textarea" >Descrição</label> 
    62                         <textarea name="description" <%= (data.event.isOrganizer == 0) ? 'disabled="disabled"' : '' %> ><%=(data.event) ? data.event.description : '' %></textarea> 
     65                        <textarea name="description" <%= (data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> ><%=(data.event) ? data.event.description : '' %></textarea> 
    6366                </p> 
    6467 
     
    144147        <fieldset id="calendar_addevent_details6" class="tab-level2" title="Participantes"> 
    145148        </fieldset> 
     149         
     150         
     151        <fieldset class="attachment-list hidden"> 
     152        </fieldset> 
    146153    </form> 
    147     <form action="../../../../upload.php" method="POST">         
    148 <!-- 
     154     
     155 
    149156        <fieldset id="calendar_addevent_details5" class="tab-level2"> 
    150                 <span class="input_label">Anexos</span>  
    151                   <ul class="attachments-list"> 
    152                         <% if (data.event && data.event.attachments) { 
    153                                 for (var i=0; i< data.event.attachments.length; i++) { 
    154                         %> 
    155                                 <li> 
    156                                         <a href="<%= data.event.attachments[i].src %>" > 
    157                                                 <input type="checkbox" name="attachments['<%= data.event.attachments[i].name %>']" checked="checked" /> 
    158                                                 <label for="calendar_addevent_details_attach_<%=i%>"><%= data.event.attachments[i].name %></label> 
    159                                         </a> 
    160                                 </li> 
    161                         <%      } 
    162                            } 
    163                         %> 
    164  
    165                   </ul> 
    166                 <span class="button add button-add-attachment">Adicionar anexo</span> 
    167          
    168                 <div id="fileupload"> 
    169                         <div title="form:upload.php"> 
    170                                 <div class="fileupload-buttonbar"> 
    171                                         <label class="fileinput-button"> 
    172                                                 <span>Add files...</span> 
    173                                                 <input type="file" name="files[]" multiple> 
    174                                         </label> 
    175                                         <button type="submit" class="start">Start upload</button> 
    176                                         <button type="reset"  class="cancel">Cancel upload</button> 
    177                                         <button type="button" class="delete">Delete files</button> 
    178                                 </div> 
    179                         </div> 
    180                         <div class="fileupload-content"> 
    181                                 <table class="files"></table> 
    182                                 <div class="fileupload-progressbar"></div> 
    183                         </div> 
    184                 </div> 
     157                <form id="fileupload" action="attachment:detail" method="POST"> 
     158        <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload --> 
     159        <div class="row fileupload-buttonbar"> 
     160            <div class="button-files-upload"> 
     161                <!-- The fileinput-button span is used to style the file input field as button --> 
     162                <span class="button btn-success fileinput-button"> 
     163                    <span><i class="icon-plus icon-white"></i> Adicionar</span> 
     164                    <input type="file" name="files[]" multiple> 
     165                </span> 
     166                                <%if(data.event.acl.organization || data.event.acl.write){%> 
     167                                        <button type="button" class="button btn-danger delete"> 
     168                                                <i class="icon-trash icon-white"></i> Remover Todos 
     169                                        </button> 
     170                                <%}%> 
     171            </div> 
     172                        <div id="fileupload-progress"></div> 
     173            <div class="files-list"> 
     174               <ul class="attachments-list"> 
     175                           <%if(data.event && data.event.attachments){ 
     176                                        for (var i=0; i< data.event.attachments.length; i++) { 
     177                                        %> 
     178                                                <p class="input-group arquive-info"> 
     179                                                        <label class="lbl-archive-nome">Nome:</label> 
     180                                                        <span class="archive-nome"><%=data.event.attachments[i].name%></span> 
     181                                                         
     182                                                        <label class="lbl-archive-size">Tamanho:</label> 
     183                                                        <span class="archive-size"><%=data.event.attachments[i].size%> kb</span> 
     184                                                        <a href="../prototype/getArchive.php?attachment=<%=data.event.attachments[i].id%>" class="button tiny upload downlaod-archive">Download</a> 
     185                                                        <%if(data.event.acl.organization || data.event.acl.write){%> 
     186                                                                <span class="button close tiny upload delete-upload" title="Deletar">Deletar</span> 
     187                                                        <%}%> 
     188                                                        <input type="hidden" name="fileId[]" value="<%=data.event.attachments[i].id%>"/> 
     189                                                </p> 
     190                                        <%} 
     191                                }%> 
     192                            
     193                            
     194                           </ul> 
     195            </div> 
     196        </div> 
     197        <br> 
     198         
     199    </form> 
     200 
     201        </fieldset> 
    185202 
    186203        </fieldset> 
     
    194211    <div class="menu-container footer-container menu-addevent"> 
    195212            <% if (data.event.id) { %> 
    196                 <a class="button export" href="#">Exportar</a> 
    197             <a class="button delete" href="#">Excluir</a> 
     213                        <a class="button export" href="#">Exportar</a> 
     214                        <a class="button delete" href="#">Excluir</a> 
    198215            <% } %> 
    199216                <a class="button cancel" href="#">Cancelar</a> 
    200217            <a class="button save" href="#">Salvar</a> 
    201218    </div> 
    202 <!--</div>--> 
     219</div> 
    203220<!--<script src="application.js"></script>--> 
     221<!--<script src="application.js"></script>--> 
  • trunk/prototype/modules/calendar/templates/index.ejs

    r5468 r5514  
    4040<script type='text/javascript' src='<?= PLUGINSURL ?>/store/jquery.store.js'></script> 
    4141<script type='text/javascript' src='<?= PLUGINSURL ?>/fileupload/jquery.fileupload.js'></script> 
    42 <script type='text/javascript' src='<?= PLUGINSURL ?>/fileupload/jquery.fileupload-ui.js'></script> 
     42<!--<script type='text/javascript' src='<?= PLUGINSURL ?>/fileupload/jquery.fileupload-ui.js'></script>--> 
    4343<script type='text/javascript' src='<?= PLUGINSURL ?>/fileupload/jquery.iframe-transport.js'></script> 
    4444<script type='text/javascript' src='<?= PLUGINSURL ?>/store/jquery.store.js'></script> 
  • trunk/prototype/modules/calendar/templates/participants_add_itemlist.ejs

    r5360 r5514  
    11<li class="attendee">  
    22        <div style="overflow:hidden; width:100%; display:table;"> 
    3                 <input type="checkbox" value="<%= data[0].id %>" disabled="disabled"> 
     3                <div class="attendee-options"> 
     4                        <%if(data[0].acl.organization || data[0].acl.write || data[0].acl.inviteGuests){%> 
     5                                <a href="#" class="button delegate attendee-options-button-delegate new">Delegar participação a este participante</a> 
     6                        <%}%> 
     7                        <%if(data[0].acl.organization || data[0].acl.write){%> 
     8                                <a class="button edit attendee-options-button-edit new">Editar permissões</a> 
     9                        <%}%> 
     10                        <a class="button close new">Close</a> 
     11                </div> 
     12                 
     13                <input class="new" type="checkbox" value="<%= data[0].id %>"> 
    414                <input type="hidden" name="attendee[]" value="<%= data[0].id %>"> 
    515                <input type="hidden" name="attendeeType[]" value="<%=data[0].isExternal%>"> 
     16                <input type="hidden" name="attendeeAcl[]" value="r"> 
     17                <input type="hidden" name="delegatedFrom[]" value="0"> 
    618                <label title="<%= data[0].name ? data[0].name : '' %>" class="name"><%= data[0].name ? data[0].name : '' %></label> 
    7                 <label title="<%= data[0].mail ? data[0].mail : '' %>" class="mail"><%= data[0].mail ? data[0].mail : '' %></label> 
    8         </div>  
    9         <a class="button close">Close</a> 
     19                <label title="<%= data[0].mail ? data[0].mail : '' %>" class="mail <%= data[0].name ? 'hidden' : ''%>"><%= data[0].mail ? data[0].mail : '' %></label> 
     20 
     21        </div> 
     22         
    1023</li> 
Note: See TracChangeset for help on using the changeset viewer.