Changeset 6996


Ignore:
Timestamp:
08/10/12 19:11:37 (8 years ago)
Author:
acoutinho
Message:

Ticket #2966 - Merge de novas funcionalidades com trunk #2951, #2952

Location:
trunk
Files:
48 edited
45 copied

Legend:

Unmodified
Added
Removed
  • trunk/expressoCalendar/setup/default_records.inc.php

    r5804 r6996  
    3838                $oProc->query("ALTER TABLE calendar ALTER COLUMN dtstamp SET DEFAULT (date_part('epoch'::text, ('now'::text)::timestamp(3) with time zone) * (1000)::double precision);"); 
    3939         
    40                 $oProc->query("INSERT INTO calendar_object_type( \"id\", \"name\") VALUES ('1','VEVENT');"); 
     40        $oProc->query("INSERT INTO calendar_object_type( \"id\", \"name\") VALUES ('1','VEVENT');"); 
     41                $oProc->query("INSERT INTO calendar_object_type( \"id\", \"name\") VALUES ('2','TODO');"); 
    4142                $oProc->query("INSERT INTO calendar_class( \"id\", \"name\") VALUES ('1','Public'),('2','Private'),('3','Confidential');"); 
    4243                $oProc->query("INSERT INTO calendar_participant_status( \"id\", \"name\") VALUES ('1','CONFIRMED'),('2','TENTATIVE'),('3','CANCELLED'),('4','UNANSWERED'),('5', 'DELEGATED');"); 
  • trunk/expressoCalendar/setup/setup.inc.php

    r6255 r6996  
    1313        $setup_info['expressoCalendar']['title']        = 'Expresso Calendar'; 
    1414        /* Ao incrementar versão, não esquecer de declarar função do tables_update.inc.php*/ 
    15         $setup_info['expressoCalendar']['version']      = '1.007'; 
     15        $setup_info['expressoCalendar']['version']      = '1.008'; 
    1616        $setup_info['expressoCalendar']['app_order']    = 10; 
    1717 
     
    3333        $setup_info['expressoCalendar']['tables'][]             =  'calendar_permission'; 
    3434        $setup_info['expressoCalendar']['tables'][]             =  'module_preference'; 
    35         $setup_info['expressoCalendar']['tables'][]             =  'calendar_repeat_ranges'; 
     35    $setup_info['expressoCalendar']['tables'][]     =  'calendar_repeat_ranges'; 
     36    $setup_info['expressoCalendar']['tables'][]     =  'calendar_task_to_activity_object'; 
     37        $setup_info['expressoCalendar']['tables'][]             =  'calendar_historic'; 
    3638 
    3739        $setup_info['expressoCalendar']['enable']               = 1; 
  • trunk/expressoCalendar/setup/tables_current.inc.php

    r6114 r6996  
    4848                'duration' => array('type' => 'int', 'precision' => '8' ,'nullable' => True), 
    4949                'tzid' => array('type' => 'varchar', 'precision' => '50' ,'nullable' => True), 
     50                'type' => array('type' => 'int', 'precision' => '2' ,'nullable' => false, 'default' => 0), 
    5051                'dtstamp' => array('type' => 'int', 'precision' => '8' ,'nullable' => True) 
    5152            ), 
     
    100101            'uc' => array() 
    101102                ), 
     103 
     104       'calendar_task_to_activity_object' => array( 
     105            'fd' => array( 
     106                'id' => array( 'type' => 'auto', 'nullable' => False), 
     107                'calendar_object_activity_id' => array(  'type' => 'int', 'precision' => '8', 'nullable' => False), 
     108                'calendar_object_task_id' => array(  'type' => 'int', 'precision' => '8', 'nullable' => False), 
     109                'owner' => array(  'type' => 'int', 'precision' => '8', 'nullable' => False), 
     110            ), 
     111            'pk' => array('id'), 
     112            'fk' => array(), 
     113            'ix' => array(), 
     114            'uc' => array() 
     115        ), 
    102116             
    103117             
     
    121135                'tzid' => array('type' => 'varchar', 'precision' => '50' ,'nullable' => True), 
    122136                'transp' => array( 'type' => 'int', 'precision' => '2', 'nullable' => FALSE , 'default' => 0 ), 
    123                 'sequence' => array( 'type' => 'int', 'precision' => '8', 'nullable' => FALSE , 'default' => 0 ) 
     137                'sequence' => array( 'type' => 'int', 'precision' => '8', 'nullable' => FALSE , 'default' => 0 ), 
     138                'due' => array( 'type' => 'int', 'precision' => '8', 'nullable' => FALSE , 'default' => 0 ), 
     139                'percentage' => array( 'type' => 'int', 'precision' => '8', 'nullable' => FALSE , 'default' => 0 ), 
     140                'status' => array( 'type' => 'int', 'precision' => '8', 'nullable' => FALSE , 'default' => 0 ), 
     141                'priority' => array( 'type' => 'int', 'precision' => '8', 'nullable' => FALSE , 'default' => 2 ) 
    124142            ), 
    125143            'pk' => array('id'), 
     
    130148                 
    131149             
    132             'calendar_participant' => array( 
     150        'calendar_participant' => array( 
    133151            'fd' => array( 
    134152                'id' => array( 'type' => 'auto', 'nullable' => False), 
     
    165183            'uc' => array() 
    166184                ), 
    167                  
    168                  
    169             'calendar_signature_alarm' => array( 
     185 
     186        'calendar_historic' => array( 
     187            'fd' => array( 
     188                'id' => array( 'type' => 'auto', 'nullable' => False), 
     189                'object_id' => array('type' => 'int', 'precision' => '8','nullable' => True), 
     190                'user_uidnumber' => array( 'type' => 'int', 'precision' => '8', 'nullable' => False), 
     191                'dtstamp' => array( 'type' => 'bigint', 'precision' => '16', 'nullable' => False), 
     192                'attribute' => array('type' => 'varchar','precision' => '50','nullable' => True), 
     193                'before_value' => array( 'type' => 'varchar', 'precision' => '255', 'nullable' => True),               
     194                'after_value' => array( 'type' => 'varchar', 'precision' => '255', 'nullable' => True)             
     195            ), 
     196            'pk' => array('id'), 
     197            'fk' => array(), 
     198            'ix' => array(), 
     199            'uc' => array() 
     200        ),       
     201                 
     202        'calendar_signature_alarm' => array( 
    170203            'fd' => array( 
    171204                'id' => array( 'type' => 'auto', 'nullable' => False), 
     
    277310                                'msg_alarms' => array( 'type' => 'text', 'nullable' => True), 
    278311                                'font_color' => array(  'type' => 'varchar','precision' => '6', 'nullable' => True), 
    279                                 'background_color' => array(  'type' => 'varchar','precision' => '6', 'nullable' => True), 
    280                                 'border_color' => array(  'type' => 'varchar','precision' => '6', 'nullable' => True) 
    281                                  
     312                'background_color' => array(  'type' => 'varchar','precision' => '6', 'nullable' => True), 
     313                'border_color' => array(  'type' => 'varchar','precision' => '6', 'nullable' => True), 
     314                'type' => array('type' => 'int', 'precision' => '2' ,'nullable' => false, 'default' => 0) 
    282315            ), 
    283316            'pk' => array('id'), 
  • trunk/expressoCalendar/setup/tables_update.inc.php

    r6255 r6996  
    5757 
    5858                $oProc->CreateTable('calendar_repeat_ranges', array( 
    59                                 'fd' => array( 
    60                                     'id' => array( 'type' => 'auto', 'nullable' => False), 
    61                                     'range_start' => array(  'type' => 'bigint','precision' => '16', 'nullable' => False), 
    62                                     'range_end' => array(  'type' => 'bigint', 'precision' => '16', 'nullable' => False), 
    63                                     'user_info_id' => array(  'type' => 'bigint', 'precision' => '16', 'nullable' => False) 
    64                                 ), 
    65                                 'pk' => array('id'), 
    66                                 'fk' => array(), 
    67                                 'ix' => array(), 
    68                                 'uc' => array() 
    69                                     ) 
     59                        'fd' => array( 
     60                            'id' => array( 'type' => 'auto', 'nullable' => False), 
     61                            'range_start' => array(  'type' => 'bigint','precision' => '16', 'nullable' => False), 
     62                            'range_end' => array(  'type' => 'bigint', 'precision' => '16', 'nullable' => False), 
     63                            'user_info_id' => array(  'type' => 'bigint', 'precision' => '16', 'nullable' => False) 
     64                        ), 
     65                        'pk' => array('id'), 
     66                        'fk' => array(), 
     67                        'ix' => array(), 
     68                        'uc' => array() 
     69                            ) 
    7070                ); 
    7171 
     
    7979        function expressoCalendar_upgrade1_002() { 
    8080 
    81             $oProc = $GLOBALS['phpgw_setup']->oProc; 
     81        $oProc = $GLOBALS['phpgw_setup']->oProc; 
    8282 
    83             $oProc->query("ALTER TABLE calendar_repeat_occurrence ADD COLUMN exception smallint DEFAULT 0"); 
     83        $oProc->query("ALTER TABLE calendar_repeat_occurrence ADD COLUMN exception smallint DEFAULT 0"); 
    8484 
    85             $GLOBALS['setup_info']['expressoCalendar']['currentver'] = '1.003'; 
    86             return $GLOBALS['setup_info']['expressoCalendar']['currentver']; 
     85        $GLOBALS['setup_info']['expressoCalendar']['currentver'] = '1.003'; 
     86        return $GLOBALS['setup_info']['expressoCalendar']['currentver']; 
    8787        }; 
    8888         
    8989        $test[] = '1.003'; 
    9090        function expressoCalendar_upgrade1_003() { 
    91             $GLOBALS['setup_info']['expressoCalendar']['currentver'] = '1.004'; 
    92             return $GLOBALS['setup_info']['expressoCalendar']['currentver']; 
     91        $GLOBALS['setup_info']['expressoCalendar']['currentver'] = '1.004'; 
     92        return $GLOBALS['setup_info']['expressoCalendar']['currentver']; 
    9393        }; 
    9494 
    9595        $test[] = '1.004'; 
    9696        function expressoCalendar_upgrade1_004() { 
    97             $oProc = $GLOBALS['phpgw_setup']->oProc; 
    98             $oProc->query("ALTER TABLE calendar_repeat_occurrence  ALTER COLUMN exception SET default 0"); 
     97        $oProc = $GLOBALS['phpgw_setup']->oProc; 
     98        $oProc->query("ALTER TABLE calendar_repeat_occurrence  ALTER COLUMN exception SET default 0"); 
    9999 
    100             $GLOBALS['setup_info']['expressoCalendar']['currentver'] = '1.005'; 
    101             return $GLOBALS['setup_info']['expressoCalendar']['currentver']; 
     100        $GLOBALS['setup_info']['expressoCalendar']['currentver'] = '1.005'; 
     101        return $GLOBALS['setup_info']['expressoCalendar']['currentver']; 
    102102        }; 
    103103         
    104104        $test[] = '1.005'; 
    105105        function expressoCalendar_upgrade1_005() { 
    106             $oProc = $GLOBALS['phpgw_setup']->oProc; 
    107             $oProc->query("ALTER TABLE calendar_alarm ADD COLUMN alarm_offset bigint;"); 
     106        $oProc = $GLOBALS['phpgw_setup']->oProc; 
     107        $oProc->query("ALTER TABLE calendar_alarm ADD COLUMN alarm_offset bigint;"); 
    108108            $oProc->query("UPDATE calendar_alarm SET alarm_offset = obj.range_start - calendar_alarm.range_start FROM calendar_object as obj WHERE obj.id = object_id;"); 
    109109            $oProc->query("ALTER TABLE calendar_alarm DROP COLUMN range_start;"); 
    110110            $oProc->query("ALTER TABLE calendar_alarm DROP COLUMN range_end;"); 
    111             $GLOBALS['setup_info']['expressoCalendar']['currentver'] = '1.006'; 
    112             return $GLOBALS['setup_info']['expressoCalendar']['currentver']; 
     111        $GLOBALS['setup_info']['expressoCalendar']['currentver'] = '1.006'; 
     112        return $GLOBALS['setup_info']['expressoCalendar']['currentver']; 
    113113        }; 
    114114         
     
    120120        }; 
    121121         
     122        $test[] = '1.007'; 
     123        function expressoCalendar_upgrade1_007() { 
     124            $oProc = $GLOBALS['phpgw_setup']->oProc; 
     125 
     126            $oProc->query("ALTER TABLE calendar_object ADD COLUMN priority smallint DEFAULT 0;"); 
     127            $oProc->query("ALTER TABLE calendar_object ADD COLUMN percentage smallint DEFAULT 0;"); 
     128            $oProc->query("ALTER TABLE calendar_object ADD COLUMN status smallint DEFAULT 0;"); 
     129 
     130            $oProc->query("ALTER TABLE calendar_object ADD COLUMN due bigint DEFAULT 0;"); 
     131 
     132            $oProc->query("ALTER TABLE calendar ADD COLUMN type smallint DEFAULT 0;"); 
     133            $oProc->query("ALTER TABLE calendar_signature ADD COLUMN type smallint DEFAULT 0;"); 
     134 
     135            $oProc->query("INSERT INTO calendar_object_type(id, name) VALUES ('2', 'TODO');"); 
     136 
     137            $oProc->query("CREATE TABLE calendar_task_to_activity_object(id serial not null, calendar_object_activity_id integer not null, calendar_object_task_id integer not null, owner integer not null);"); 
     138 
     139            $oProc->CreateTable('calendar_historic', array( 
     140                'fd' => array( 
     141                    'id' => array( 'type' => 'auto', 'nullable' => False), 
     142                    'object_id' => array('type' => 'int', 'precision' => '8','nullable' => True), 
     143                    'user_uidnumber' => array( 'type' => 'int', 'precision' => '8', 'nullable' => False), 
     144                    'dtstamp' => array( 'type' => 'bigint', 'precision' => '16', 'nullable' => False), 
     145                    'attribute' => array('type' => 'varchar','precision' => '50','nullable' => True), 
     146                    'before_value' => array( 'type' => 'varchar', 'precision' => '255', 'nullable' => True),               
     147                    'after_value' => array( 'type' => 'varchar', 'precision' => '255', 'nullable' => True)             
     148                ), 
     149                'pk' => array('id'), 
     150                'fk' => array(), 
     151                'ix' => array(), 
     152                'uc' => array() 
     153                ) 
     154            ); 
     155 
     156            $oProc->CreateTable('calendar_task_to_activity_object', array( 
     157                'fd' => array( 
     158                    'id' => array( 'type' => 'auto', 'nullable' => False), 
     159                    'calendar_object_activity_id' => array(  'type' => 'int', 'precision' => '8', 'nullable' => False), 
     160                    'calendar_object_task_id' => array(  'type' => 'int', 'precision' => '8', 'nullable' => False), 
     161                    'owner' => array(  'type' => 'int', 'precision' => '8', 'nullable' => False), 
     162                ), 
     163                'pk' => array('id'), 
     164                'fk' => array(), 
     165                'ix' => array(), 
     166                'uc' => array() 
     167                ) 
     168            ); 
     169 
     170            $GLOBALS['setup_info']['expressoCalendar']['currentver'] = '1.008'; 
     171            return $GLOBALS['setup_info']['expressoCalendar']['currentver']; 
     172        }; 
     173         
    122174?> 
  • trunk/expressoMail1_2/inc/hook_settings.inc.php

    r6858 r6996  
    345345create_check_box('Show previous message, after delete actual message?','delete_and_show_previous_message','Enable this option if you want to read the next message everytime you delete a message'); 
    346346create_check_box('Do you wanna receive an alert for new messages?','alert_new_msg','Everytime you receive new messages you will be informed'); 
     347 
     348 
     349create_check_box('Wish you receive notifications for: "New messages", "Filter criteria", "Event alerts"?','notifications','Everytime you receive new messages you will be informed'); 
     350 
     351 
     352 
    347353create_check_box('Show default view on main screen?','mainscreen_showmail','Show unread messages in your home page'); 
    348354create_check_box('Do you want to use remove attachments function?','remove_attachments_function','It allow you to remove attachments from messages'); 
  • trunk/expressoMail1_2/index.php

    r6858 r6996  
    2323        echo "<script src='js/modal/modal.js'></script>"; 
    2424        //jquery and Editor  
    25         echo '                   
     25        echo '  
    2626                <link rel="stylesheet" type="text/css" href="templates/default/main.css"></link> 
     27                 
    2728                <link rel="stylesheet" type="text/css" href="../phpgwapi/js/dftree/dftree.css"></link> 
     29                 
     30                <link rel="stylesheet" type="text/css" href="../prototype/plugins/jquery.spinner/jquery.spinner.css"></link> 
    2831                <link rel="stylesheet" type="text/css" href="../prototype/plugins/fullcalendar/fullcalendar.css"></link> 
    2932                <link rel="stylesheet" type="text/css" href="../prototype/plugins/fullcalendar/fullcalendar.print.css"></link> 
     
    3235                <script type="text/javascript" src="../prototype/plugins/jquery/jquery.min.js"></script> 
    3336                <link href="../prototype/modules/filters/filters.css" rel="stylesheet" type="text/css"> 
     37                 
    3438                <script type="text/javascript" src="../prototype/plugins/jquery/jquery-ui.min.js"></script> 
    3539                <script src="../prototype/plugins/json2/json2.js" language="javascript"></script> 
     
    7276                <script type="text/javascript" src="../prototype/plugins/contextmenu/jquery.contextMenu.js"></script> 
    7377                <!-- <script type="text/javascript" src="../prototype/plugins/contextmenu/jquery.ui.position.js"></script> --> 
    74                  
     78 
    7579                <script type="text/javascript" src="../prototype/modules/calendar/js/timezone.js"></script> 
    76         <script type="text/javascript" src="../prototype/plugins/dateFormat/dateFormat.js"></script> 
     80                <script type="text/javascript" src="../prototype/plugins/dateFormat/dateFormat.js"></script> 
    7781                <script type="text/javascript" src="../prototype/modules/calendar/js/calendar.date.js"></script> 
     82                <script type="text/javascript" src="../prototype/modules/calendar/js/desktop.notification.js"></script> 
    7883                <script type="text/javascript" src="../prototype/modules/calendar/js/calendar.codecs.js"></script> 
     84                <script type="text/javascript" src="../prototype/modules/calendar/js/calendar.alarms.js"></script> 
    7985                <link rel="stylesheet" type="text/css" href="../prototype/plugins/freeow/style/freeow/freeow.css" > 
    8086                <script type="text/javascript" src="../prototype/plugins/freeow/jquery.freeow.min.js"></script> 
  • trunk/expressoMail1_2/js/common_functions.js

    r6930 r6996  
    12861286    return folderName; 
    12871287} 
     1288 
     1289function useDesktopNotification(){ 
     1290    return !!parseInt(preferences.notifications); 
     1291} 
  • trunk/expressoMail1_2/js/draw_api.js

    r6975 r6996  
    32203220        subject.className = "header_message_field"; 
    32213221        if(defaultCalendar == "expressoCalendar" && $("#expressoCalendarid")[0]){ 
     3222                var new_task_logo = document.createElement("IMG"); 
     3223                new_task_logo.title = "Criar uma nova tarefa a partir deste email."; 
     3224                new_task_logo.alt = "Criar uma nova tarefa a partir deste email."; 
     3225                new_task_logo.src = "./templates/default/images/big-task.png"; 
     3226                new_task_logo.style.cursor = "pointer"; 
     3227                new_task_logo.style.marginLeft = "5px"; 
     3228                new_task_logo.onclick = function(){ 
     3229                import_implements_calendar(); 
     3230                 
     3231                 
     3232                        DataLayer.dispatchPath = "../prototype/"; 
     3233                        var path = "../prototype/modules/calendar/"; 
     3234                        taskDetails(decodeCreateSchedulable('task', ID), true, path, true); 
     3235                } 
     3236                 
    32223237                var new_event_logo = document.createElement("IMG"); 
    32233238                new_event_logo.title = "Criar evento a partir deste email"; 
    32243239                new_event_logo.alt = "Criar evento a partir deste email"; 
    3225                 new_event_logo.src = "./templates/default/images/calendar_add.png"; 
     3240                //new_event_logo.src = "./templates/default/images/calendar_add.png"; 
     3241                new_event_logo.src = "./templates/default/images/big-event.png"; 
    32263242                new_event_logo.style.cursor = "pointer"; 
    32273243                new_event_logo.style.marginLeft = "5px"; 
     
    32323248                        DataLayer.dispatchPath = "../prototype/"; 
    32333249                        var path = "../prototype/modules/calendar/"; 
    3234                          
    3235                         var startEvent = new Date();   
    3236                         if(startEvent.toString('mm') < 30)  
    3237                                 startEvent.add({minutes: (30 - parseInt(startEvent.toString('mm')))});  
    3238                         else  
    3239                                 startEvent.add({hours: 1, minutes: '-'+startEvent.toString('mm')});  
    3240                         var endEvent = function(date){  
    3241                                 if(!!User.preferences.defaultCalendar){  
    3242                                         return  new Date(parseInt(date.getTime()) +  
    3243                                                     (!!Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration ?   
    3244                                                         (Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration * 60000) : 
    3245                                                         (User.preferences.defaultDuration * 60000) 
    3246                                                 )); 
    3247                                 }else  
    3248                                         return new Date(parseInt(date.getTime()) + (User.preferences.defaultDuration * 60000));  
    3249                         };        
    3250  
    3251                         var emails = $("#to_values_"+ID).val().split(','); 
    3252                          
    3253                          
    3254                         //Normalização dos dados evita ter que reemplementar toda as funcionalidades do calendar 
    3255                         eventDetails({  
    3256                                          
    3257                                         acl: {inviteGuests: true, organization: true ,participationRequired: false, read: true, write: true}, 
    3258                                         alarms: [], 
    3259                                         allDay: false, 
    3260                                         attachments: [], 
    3261                                         isAttendee: true, 
    3262                                         attendee: '',//TODOOOOOO, 
    3263                                         calendar: User.preferences.defaultCalendar ? User.preferences.defaultCalendar : Calendar.calendars[0], 
    3264                                         calendars: Calendar.calendars, 
    3265                                         category: '', 
    3266                                         'class': '1', 
    3267                                         delegatedFrom: {}, 
    3268                                         endDate: startEvent.toString(User.preferences.dateFormat), 
    3269                                         startDate: endEvent(startEvent).toString(User.preferences.dateFormat), 
    3270                                         startHour: startEvent.toString(User.preferences.hourFormat), 
    3271                                         endHour: endEvent(startEvent).toString(User.preferences.hourFormat), 
    3272                                         timezone: User.preferences.defaultCalendar ? Calendar.signatureOf[User.preferences.defaultCalendar].calendar.timezone : User.preferences.timezone, 
    3273                                         summary : $("#subject_"+ID).text(), 
    3274                                         description : $("#body_" + ID).text(), 
    3275                                         startTime: startEvent.getTime(), 
    3276                                         endTime: endEvent(startEvent), 
    3277                                         timezones: Timezone.timezones, 
    3278                                         me: {name: User.me.name, mail: User.me.mail, acl: 'rowi', status: '1', delegatedFrom: '0', id: User.me.id}, 
    3279                                         organizer: {name: User.me.name, mail: User.me.mail, acl: 'rowi', status: '1', delegatedFrom: '0' , id: User.me.id}, 
    3280                                         statusParticipants: {accepted: 0, cancelled: 0, tentative: 0, unanswered:emails.length}, 
    3281                                         location: '', 
    3282                                         attendee: $.map(emails, function( mail ){                        
    3283                                                 var contact = false; 
    3284                                                 var decoded =  Encoder.htmlDecode(mail); 
    3285                                                 var newAttendeeName = ""; 
    3286  
    3287                                                 var name = decoded.match(/"([^"]*)"/) ? decoded.match(/"([^"]*)"/)[1] : ''; 
    3288                                                 var mail = decoded.match(/<([^<]*)>[\s]*$/) ? decoded.match(/<([^<]*)>[\s]*$/)[1].toLowerCase() : decoded;  
    3289  
    3290  
    3291                                                 var user = DataLayer.get('user', ["=", "mail", mail], true); 
    3292                                                  
    3293                                                 if( $.type(user) == "array") 
    3294                                                     user = user[0]; 
    3295  
    3296                                                 if(user != ''){ 
    3297                                                     //user = {name : name , mail : mail}; 
    3298                                                     if(User.me.mail == user.mail) 
    3299                                                             return(null); 
    3300                                                     user.isExternal = (!!user && !(!!user.isExternal)) ? 0 : 1; 
    3301  
    3302                                                     return  DataLayer.merge({ 
    3303                                                             name: user.name, 
    3304                                                             mail: user.mail, 
    3305                                                             acl:  'r', 
    3306                                                             delegatedFrom: '0', 
    3307                                                             status: '4', 
    3308                                                             isExternal: user.isExternal 
    3309                                                     }, !!user.id ? {id : DataLayer.put('participant', {user: user.id, isExternal: user.isExternal})} : {id: DataLayer.put('participant', {user: user})});  
    3310                                                 }else if(mail.match(/[\w-]+(\.[\w-]+)*@(([A-Za-z\d][A-Za-z\d-]{0,61}[A-Za-z\d]\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])/)){ 
    3311                                                      
    3312                                                     var userId = DataLayer.put('user', { 
    3313                                                         name: name,  
    3314                                                         mail: mail,  
    3315                                                         isExternal: '1' 
    3316                                                     }); 
    3317                                                     var newAttendeeId = DataLayer.put('participant', { 
    3318                                                         user: userId,  
    3319                                                         isExternal: '1' 
    3320                                                     }); 
    3321  
    3322                                                     return  { 
    3323                                                             id: newAttendeeId, 
    3324                                                             name: name, 
    3325                                                             mail: mail, 
    3326                                                             acl:  'r', 
    3327                                                             delegatedFrom: '0', 
    3328                                                             status: '4', 
    3329                                                             isExternal: '1' 
    3330                                                     }; 
    3331                                                      
    3332                                                 }else 
    3333                                                     return (null); 
    3334                                         })       
    3335                                          
    3336                         }, true, path, true); 
     3250 
     3251                        eventDetails(decodeCreateSchedulable('event', ID), true, path, true); 
    33373252                } 
    33383253                subject.appendChild(new_event_logo); 
     3254                subject.appendChild(new_task_logo); 
    33393255        } 
    33403256        tr5.appendChild(td5); 
  • trunk/expressoMail1_2/js/main.js

    r6980 r6996  
    11// Tempo do auto refresh (em milisegundos) 
    22var time_refresh = 300000; 
     3 
    34// tempo do auto save (em milisegundos) 
    45// 20000 = 20 segundos 
     
    67var results_search_messages = "";  
    78var cabecalho = '<h4>ExpressoLivre - ExpressoMail</h4>';  
    8 // Variavel para controle de atualização das mensagens listadas na modal de alerta de filtro por remetente 
    9 var checkAlarmsFilter = false; 
     9 
     10var auxNotificationCriteriaVetor = []; 
     11var auxNotification; 
     12 
     13var countNewMessage = 0; 
     14var notifyNewMessageFilter = []; 
    1015 
    1116var dynamicPersonalContacts = new Array(); 
     
    2025        }  
    2126} 
    22          
     27 
    2328function mount_url_folder(folders){ 
    2429        return folders.join(cyrus_delimiter); 
     
    7580                 
    7681                        if(preferences.show_name_print_messages == "1") {  
    77                                                         var getUserName = document.getElementById("user_info");  
     82                                var getUserName = document.getElementById("user_info");  
    7883                                var userName = getUserName.innerHTML;  
    7984                                var position = userName.indexOf("-");  
     
    572577 
    573578function auto_refresh(){ 
    574         refresh(preferences.alert_new_msg); 
     579        refresh(preferences.alert_new_msg, preferences.notifications); 
    575580        setTimeout('auto_refresh()', time_refresh); 
    576581} 
     
    581586} 
    582587 
    583 function refresh(alert_new_msg){ 
     588function notificationFilter(data, notifyCriteria){ 
     589         
     590        if(parseInt(notifyCriteria)  && data.length > 0 && !activePage ){ 
     591         
     592                var howManyCriteria = $('div.gray.filtersDeadline .message-list li').length; 
     593                var differenceOfNewCriteria = data.length - howManyCriteria; 
     594                 
     595                if(differenceOfNewCriteria > 0){ 
     596                        for(var i=data.length - differenceOfNewCriteria; i < data.length; i++){ 
     597         
     598                                desktopNotification.sentNotification("",get_lang("Filter criteria"),  truncate(new Date(data[i].udate).toString('dd/MM HH:mm') + ' - ' + data[i].from+' - '+data[i].subject, 75)); 
     599                                desktopNotification.showNotification(false, function(){ 
     600                                        window.focus(); 
     601                                        this.cancel(); 
     602                                }); 
     603                        } 
     604                } 
     605        } 
     606} 
     607 
     608function refresh(alert_new_msg, notifyPermission){ 
     609 
    584610        getFromAlertRules(); 
    585611        var handler_refresh = function(data){ 
    586                 if(checkAlarmsFilter){ 
    587                         handlerMessageFilter = function (data) { 
    588                                 alarmFollowupflagged('filtersAlarms', data); 
    589                         } 
    590                         /* Busca  nas pastas indexadas para ver se há novas mensagens com a flag $FilteredMessage */ 
    591                         cExecute ("$this.imap_functions.getFlaggedAlertMessages&folders="+fromRules, handlerMessageFilter); 
    592                 } 
    593                 checkAlarmsFilter = true; 
     612                handlerMessageFilter = function (data) {                         
     613                        alarmFollowupflagged('filtersAlarms', data); 
     614                        notificationFilter(data, notifyPermission); 
     615                } 
     616                /* Busca  nas pastas indexadas para ver se há novas mensagens com a flag $FilteredMessage */ 
     617                cExecute ("$this.imap_functions.getFlaggedAlertMessages&folders="+fromRules, handlerMessageFilter); 
     618 
    594619                if(data['msg_range_end']) 
    595620                        if(data['msg_range_end'] > 0) 
     
    603628                        showEmptyBoxMsg(box); 
    604629 
    605                 if (data.length > 0){ 
     630                if (data.length > 0 || countNewMessage > 0){ 
    606631                        for(var i=0;i< data.length;i++){ 
    607632                                if (!onceOpenedHeadersMessages[current_folder]) 
     
    742767                        if(parseInt(preferences.use_shortcuts)) 
    743768                                select_msg("null","reload_msg","null"); 
    744  
    745                         if(parseInt(alert_new_msg) && data.new_msgs > 0) 
     769                 
     770                        if(parseInt(alert_new_msg) && data.new_msgs > 0 && activePage) 
    746771                                alert(data['new_msgs'] > 1 ? get_lang("You have %1 new messages", data['new_msgs']) + "!" : get_lang("You have 1 new message") +"!"); 
     772                         
     773                         
     774                        if(parseInt(notifyPermission)  && (data.new_msgs > 0 || !!countNewMessage) && !activePage ){ 
     775                         
     776                                countNewMessage += data.length; 
     777                                 
     778                                desktopNotificationAux = desktopNotification.sentNotification("",get_lang("Notification"), countNewMessage > 1 ? get_lang("You have %1 new messages", countNewMessage) + "!" : get_lang("You have 1 new message") + "!"); 
     779                                 
     780                                if(auxNotification !== 'undefined') 
     781                                        desktopNotification.cancelByReference(auxNotification); 
     782                                 
     783                                desktopNotification.showNotification(function(){ 
     784                                        countNewMessage = 0; 
     785                                }, function(){ 
     786                                        window.focus(); 
     787                                        this.cancel(); 
     788                                        countNewMessage = 0; 
     789                                }); 
     790                                 
     791                                auxNotification = desktopNotificationAux; 
     792                        } 
    747793                        build_quota(data['quota']); 
    748794                } 
     
    40184064} 
    40194065 
     4066//Normalização dos dados evita ter que reemplementar toda as funcionalidades do calendar 
     4067function decodeCreateSchedulable(type, ID){ 
     4068        var startEvent = new Date();   
     4069        if(startEvent.toString('mm') < 30)  
     4070                startEvent.add({minutes: (30 - parseInt(startEvent.toString('mm')))});  
     4071        else  
     4072                startEvent.add({hours: 1, minutes: '-'+startEvent.toString('mm')});  
     4073        var endEvent = function(date){  
     4074        if(!!User.preferences.defaultCalendar){  
     4075                return  new Date(parseInt(date.getTime()) +  
     4076                        (!!Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration ?   
     4077                        (Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration * 60000) : 
     4078                        (User.preferences.defaultDuration * 60000) 
     4079                )); 
     4080        }else  
     4081                return new Date(parseInt(date.getTime()) + (User.preferences.defaultDuration * 60000));  
     4082        };        
     4083 
     4084        var emails = $("#to_values_"+ID).val().split(','); 
     4085         
     4086        var schedulable = {}; 
     4087         
     4088        schedulable = {  
     4089                acl: {inviteGuests: true, organization: true ,participationRequired: false, read: true, write: true}, 
     4090                alarms: [], 
     4091                allDay: false, 
     4092                attachments: [], 
     4093                isAttendee: true, 
     4094                attendee: '',//TODOOOOOO, 
     4095                category: '', 
     4096                'class': '1', 
     4097                delegatedFrom: {}, 
     4098                endDate: startEvent.toString(User.preferences.dateFormat), 
     4099                startDate: endEvent(startEvent).toString(User.preferences.dateFormat), 
     4100                startHour: startEvent.toString(User.preferences.hourFormat), 
     4101                endHour: endEvent(startEvent).toString(User.preferences.hourFormat), 
     4102                timezone: User.preferences.defaultCalendar ? Calendar.signatureOf[User.preferences.defaultCalendar].calendar.timezone : User.preferences.timezone, 
     4103                summary : $("#subject_"+ID).text(), 
     4104                description : $("#body_" + ID).text(), 
     4105                startTime: startEvent.getTime(), 
     4106                endTime: endEvent(startEvent), 
     4107                timezones: Timezone.timezones, 
     4108                me: {name: User.me.name, mail: User.me.mail, acl: 'rowi', status: '1', delegatedFrom: '0', id: User.me.id}, 
     4109                organizer: {name: User.me.name, mail: User.me.mail, acl: 'rowi', status: '1', delegatedFrom: '0' , id: User.me.id}, 
     4110                statusParticipants: {accepted: 0, cancelled: 0, tentative: 0, unanswered:emails.length}, 
     4111                location: '', 
     4112                attendee: $.map(emails, function( mail ){                        
     4113                        var contact = false; 
     4114                        var decoded =  Encoder.htmlDecode(mail); 
     4115                        var newAttendeeName = ""; 
     4116 
     4117                        var name = decoded.match(/"([^"]*)"/) ? decoded.match(/"([^"]*)"/)[1] : ''; 
     4118                        var mail = decoded.match(/<([^<]*)>[\s]*$/) ? decoded.match(/<([^<]*)>[\s]*$/)[1].toLowerCase() : decoded;  
     4119 
     4120 
     4121                        var user = DataLayer.get('user', ["=", "mail", mail], true); 
     4122                         
     4123                        if( $.type(user) == "array" ) 
     4124                                user = user[0]; 
     4125 
     4126                        if(user != ''){ 
     4127                                //user = {name : name , mail : mail}; 
     4128                                if(User.me.mail == user.mail) 
     4129                                        return(null); 
     4130                                user.isExternal = (!!user && !(!!user.isExternal)) ? 0 : 1; 
     4131 
     4132                                return  DataLayer.merge({ 
     4133                                        name: user.name, 
     4134                                        mail: user.mail, 
     4135                                        acl:  'r', 
     4136                                        delegatedFrom: '0', 
     4137                                        status: '4', 
     4138                                        isExternal: user.isExternal 
     4139                                }, !!user.id ? {id : DataLayer.put('participant', {user: user.id, isExternal: user.isExternal})} : {id: DataLayer.put('participant', {user: user})});  
     4140                        }else if(mail.match(/[\w-]+(\.[\w-]+)*@(([A-Za-z\d][A-Za-z\d-]{0,61}[A-Za-z\d]\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])/)){ 
     4141                                 
     4142                                var userId = DataLayer.put('user', { 
     4143                                name: name,  
     4144                                mail: mail,  
     4145                                isExternal: '1' 
     4146                                }); 
     4147                                var newAttendeeId = DataLayer.put('participant', { 
     4148                                user: userId,  
     4149                                isExternal: '1' 
     4150                                }); 
     4151 
     4152                                return  { 
     4153                                        id: newAttendeeId, 
     4154                                        name: name, 
     4155                                        mail: mail, 
     4156                                        acl:  'r', 
     4157                                        delegatedFrom: '0', 
     4158                                        status: '4', 
     4159                                        isExternal: '1' 
     4160                                }; 
     4161                                 
     4162                        }else 
     4163                                return (null); 
     4164                }) 
     4165        }; 
     4166 
     4167        schedulable  = DataLayer.merge(schedulable,  
     4168                type == 'event' ?  
     4169                {calendar: User.preferences.defaultCalendar ? User.preferences.defaultCalendar : Calendar.calendars[0], calendars: Calendar.calendars} 
     4170                : {group: Calendar.groups[0].id, groups: Calendar.groups, percentage: 0} 
     4171        ); 
     4172         
     4173        return schedulable; 
     4174             
     4175 
     4176} 
     4177 
    40204178function import_implements_calendar(){ 
    40214179 
     
    40314189                $.ajax({url: "../prototype/modules/calendar/js/map.disponibility.js", async: false, beforeSend: function( xhr ) {xhr.overrideMimeType('text/javascript; charset=ISO-8859-1')}}); 
    40324190                $.ajax({url: "../prototype/modules/calendar/js/helpers.js", async: false, beforeSend: function( xhr ) {xhr.overrideMimeType('text/javascript; charset=ISO-8859-1')}}); 
     4191                $.ajax({url: "../prototype/modules/calendar/js/task.helpers.js", async: false, beforeSend: function( xhr ) {xhr.overrideMimeType('text/javascript; charset=ISO-8859-1')}}); 
    40334192                //$.ajax({ url: "../prototype/modules/calendar/js/timezone.js", async: false}); 
    40344193                //$.ajax({ url: "../prototype/modules/calendar/js/calendar.codecs.js", async: false}); 
    40354194                $.ajax({url: "../prototype/plugins/encoder/encoder.js", async: false, beforeSend: function( xhr ) {xhr.overrideMimeType('text/javascript; charset=ISO-8859-1')}}); 
     4195                $.ajax({url: "../prototype/plugins/jquery.spinner/jquery.spinner.min.js", async: false, beforeSend: function( xhr ) {xhr.overrideMimeType('text/javascript; charset=ISO-8859-1')}}); 
    40364196                //$.ajax({url: "../prototype/plugins/dateFormat/dateFormat.js", async: false, beforeSend: function( xhr ) { xhr.overrideMimeType('text/javascript; charset=ISO-8859-1')}}); 
    40374197 
     
    40734233                wfolders.makeWindow('null','import'); 
    40744234} 
    4075  
    4076 function decodeOwner(){ 
     4235    //Verifica o contexto de importação 
     4236    function decodeOwner(){ 
    40774237        owner = User.me.id; 
    40784238        var imapBox = openTab.imapBox[currentTab].split(cyrus_delimiter); 
     
    40824242        }        
    40834243        return owner; 
    4084 } 
    4085 function import_calendar(data){ 
    4086     var import_url = '$this.db_functions.import_vcard&msg_folder='+data; 
    4087     var logUser; 
    4088     var up; 
    4089     var owner;    
    4090     function handler_import_calendar(data){ 
    4091             if(data === true){ 
    4092                     write_msg(get_lang("The event was imported successfully.")); 
    4093             } 
    4094             else if( data['url'] ) 
    4095             { 
    4096                 var form = document.createElement( "form" ); 
    4097  
    4098                 form.setAttribute( "action", DEFAULT_URL + data['url'] + '&isPost=true' ); 
    4099                 form.setAttribute( "method", "POST" ); 
    4100  
    4101                 document.body.appendChild( form ); 
    4102  
    4103                 form.submit(); 
    4104             } 
    4105             else 
    4106                 write_msg(get_lang(data)); 
    4107     }    
     4244    } 
     4245 
     4246   function import_calendar(data){ 
     4247        var import_url = '$this.db_functions.import_vcard&msg_folder='+data; 
     4248        var logUser; 
     4249        var up; 
     4250        var owner; 
     4251 
     4252        function handler_import_calendar(data){ 
     4253            if(data === true){ 
     4254                write_msg(get_lang("The event was imported successfully.")); 
     4255            } 
     4256            else if( data['url'] ) 
     4257            { 
     4258                var form = document.createElement( "form" ); 
     4259 
     4260                form.setAttribute( "action", DEFAULT_URL + data['url'] + '&isPost=true' ); 
     4261                form.setAttribute( "method", "POST" ); 
     4262 
     4263                document.body.appendChild( form ); 
     4264 
     4265                form.submit(); 
     4266            } 
     4267            else 
     4268                write_msg(get_lang(data)); 
     4269        }    
    41084270        if(defaultCalendar == "expressoCalendar" && $("#expressoCalendarid")[0]){ 
    4109                 import_implements_calendar(); 
     4271            import_implements_calendar(); 
    41104272                $( "#import-dialog" ).dialog({ 
    4111                         autoOpen: false, 
    4112                         height: 220, 
    4113                         modal: true, 
    4114                         resizable : false, 
    4115             open: function(event, ui)  
    4116             { 
    4117                 if(typeof(shortcut) != 'undefined') shortcut.disabled = true;  
    4118             }, 
    4119             close: function(event, ui)  
    4120             { 
    4121                 event.stopPropagation(); 
    4122                 if(typeof(shortcut) != 'undefined') shortcut.disabled = false;  
    4123             }, 
    4124                         closeOnEscape: true 
     4273                    autoOpen: false, 
     4274                    height: 220, 
     4275                    modal: true, 
     4276                    resizable : false, 
     4277                    open: function(event, ui) { 
     4278                        if(typeof(shortcut) != 'undefined') shortcut.disabled = true;  
     4279                    }, 
     4280                    close: function(event, ui){ 
     4281                        event.stopPropagation(); 
     4282                        if(typeof(shortcut) != 'undefined') shortcut.disabled = false;  
     4283                    }, 
     4284                    closeOnEscape: true 
    41254285                }); 
    4126                  
     4286                    
    41274287                $.ajax({ 
    4128                         url: "controller.php?action="+import_url+'&from_ajax=true&id_user='+User.me.id+'&readable=true&cirus_delimiter='+cyrus_delimiter+'&analize=true&uidAccount='+decodeOwner(), 
    4129                         async: false, 
    4130                         success: function(data){ 
    4131                                         data = connector.unserialize(data); 
    4132  
    4133  
    4134                                         var createDialog = function(typeImport, propaget){ 
    4135                                              
    4136                                                 if(typeof(typeImport) == "object"){ 
    4137                                                     var calendarPermission = typeImport.calendar; 
    4138                                                     typeImport = typeImport.action; 
     4288                    url: "controller.php?action="+import_url+'&from_ajax=true&id_user='+User.me.id+'&readable=true&cirus_delimiter='+cyrus_delimiter+'&analize=true&uidAccount='+decodeOwner(), 
     4289                    async: false, 
     4290                    success: function(data){ 
     4291                        data = connector.unserialize(data); 
     4292                        var createDialog = function(typeImport, propaget){ 
     4293                                                
     4294                            if(typeof(typeImport) == "object"){ 
     4295                                var calendarIds = !!typeImport.calendar ? typeImport.calendar : Calendar[typeImport.type]; 
     4296                                typeImport = typeImport.action; 
     4297                            } 
     4298                                                    
     4299                            switch(parseInt(typeImport)){ 
     4300                                case 1: 
     4301                                case 7: 
     4302                                case 10: 
     4303                                    $("#select-agenda").html(''); 
     4304 
     4305                                    var options = ''; 
     4306 
     4307                                    if(calendarIds){ 
     4308                                        for(var i = 0; i < calendarIds.length; i++) 
     4309                                            options += '<option value="'+calendarIds[i]+'">'+Calendar.signatureOf[calendarIds[i]].calendar.name+'</option>' 
     4310                                    } 
     4311 
     4312                                    $("#select-agenda").append(options); 
     4313                                    $("#select-agenda").css("display", "block"); 
     4314 
     4315                                    $("#import-dialog" ).dialog({ 
     4316                                        buttons: { 
     4317                                            Cancel: function() { 
     4318                                                $( this ).dialog( "close" ); 
     4319                                            }, 
     4320                                            "Importar" : function(){ 
     4321                                                    $.ajax({ 
     4322                                                        url: "controller.php?action="+import_url+'&from_ajax=true&selected='+$("#select-agenda option:selected").val()+'&status='+$("#select-status option:selected").val()+'&uidAccount='+decodeOwner(), 
     4323                                                        success: function(msg){ 
     4324                                                            var alt = ( (msg = connector.unserialize(msg)) == "ok") ? "Importado com sucesso para " : "Ocorreu um erro ao importar o evento/tarefa para a agenda "; 
     4325                                                            alert( alt + $("#select-agenda option:selected").text() ); 
     4326                                                        } 
     4327                                                    }); 
     4328                                                    $( this ).dialog( "close" ); 
     4329                                            } 
     4330                                        } 
     4331                                    }); 
     4332     
     4333                                    if(typeImport == 7){ 
     4334                                        $("#import-dialog").find('#select-status option[value=1]').attr('selected','selected').trigger('change'); 
     4335                                        $("#import-dialog").find('#select-status').attr('disabled','disabled'); 
     4336                                    } 
     4337                                    break; 
     4338                                case 3: 
     4339                                    $.ajax({ 
     4340                                        url: "controller.php?action="+import_url+'&from_ajax=true&selected=true', 
     4341                                        success: function(msg){ 
     4342                                            alert( ( ( connector.unserialize(msg)) == "ok") ? "Seu evento/tarefa foi removido " : "Ocorreu um erro ao remover o evento/tarefa" ); 
     4343                                        } 
     4344                                    }); 
     4345                                    return; 
     4346                                    break;  
     4347                                case 5: 
     4348                                    $.ajax({ 
     4349                                        url: "controller.php?action="+import_url+'&from_ajax=true&selected=true', 
     4350                                        success: function(msg){ 
     4351                                            alert( ( ( connector.unserialize(msg)) == "ok") ? "Seu evento/tarefa foi Atualizado com sucesso" : "Ocorreu um erro ao atualizar evento/tarefa" ); 
     4352                                        } 
     4353                                    }); 
     4354                                    return; 
     4355                                    break;  
     4356                                case 6: 
     4357                                        var acceptedSuggestion = confirm("Deseja atualizar o evento/tarefa de acordo com a sugestão ?"); 
     4358                                        $.ajax({ 
     4359                                            url: "controller.php?action="+import_url+'&from_ajax=true&id_user='+User.me.id+'&selected=true&cirus_delimiter='+cyrus_delimiter+'&acceptedSuggestion='+acceptedSuggestion+"&from="+document.getElementById('from_values_'+currentTab).value+'&uidAccount='+decodeOwner(), 
     4360                                            success: function(msg){ 
     4361                                                if(acceptedSuggestion) 
     4362                                                    alert( ( ( connector.unserialize(msg)) == "ok") ? "Evento/tarefa atualizado com sucesso " : "Ocorreu um erro ao atualizar o evento" ); 
    41394363                                                } 
    4140                                                  
    4141                                                 switch(parseInt(typeImport)){ 
    4142                                                 case 1: 
    4143                                                 case 7: 
    4144                                                 case 10: 
    4145                                                     $("#select-agenda").html(''); 
    4146  
    4147                                                     var options = ''; 
    4148  
    4149                                                     if(typeImport == 10){ 
    4150                                                         for(var i = 0; i < calendarPermission.length; i++) 
    4151                                                             options += '<option value="'+calendarPermission[i]+'">'+Calendar.signatureOf[calendarPermission[i]].calendar.name+'</option>' 
    4152                                                     }else{ 
    4153                                                         for(var id in Calendar.signatures) 
    4154                                                            options += parseInt(Calendar.signatures[id].isOwner) ? '<option value="'+Calendar.signatures[id].calendar.id+'">'+Calendar.signatures[id].calendar.name+'</option>' : '';                                                     
     4364                                        }); 
     4365                                        return; 
     4366                                        break; 
     4367                                        case 9: 
     4368                                            alert('Seu evento/tarefa não possui alterações!'); 
     4369                                            return; 
     4370                                            break; 
     4371                                        case 11: 
     4372                                            alert('Este evento/tarefa já fora importando por algum dos particpantes e já se encontra disponível em sua agenda compartilhada!'); 
     4373                                            return; 
     4374                                            break; 
     4375                                        default: 
     4376                                            up = true; 
     4377                                            $("#select-agenda").css("display", "none"); 
     4378                                            $("#import-dialog" ).children("p:first-child").css("display", "none"); 
     4379                                            $("#import-dialog" ).dialog({ 
     4380                                                height: 160, 
     4381                                                title: 'Atualizar Evento/Tarefa', 
     4382                                                buttons: { 
     4383                                                    Cancel: function() { 
     4384                                                        $( this ).dialog( "close" ); 
     4385                                                    }, 
     4386                                                    "Atualizar": function() { 
     4387                                                        $.ajax({ 
     4388                                                            url: "controller.php?action="+import_url+'&from_ajax=true&cirus_delimiter='+cyrus_delimiter+'&selected='+ (parseInt(typeImport) == 2 || parseInt(typeImport) == 4 ? 'true' : $("#select-agenda option:selected").val()) +'&status='+$("#select-status option:selected").val()+'&uidAccount='+decodeOwner(), 
     4389                                                            success: function(msg){ 
     4390                                                                alert( ( (msg = connector.unserialize(msg)) == "ok") ? "Atualizado com sucesso" : "Ocorreu um erro ao atualizar o evento" ); 
     4391                                                            } 
     4392                                                        }); 
     4393                                                        $( this ).dialog( "close" ); 
    41554394                                                    } 
    4156                                                      
    4157                                                     $("#select-agenda").append(options); 
    4158                                                     $("#select-agenda").css("display", "block"); 
    4159                                                      
    4160                                                     $("#import-dialog" ).dialog({ 
    4161                                                         buttons: { 
    4162                                                             Cancel: function() { 
    4163                                                                 $( this ).dialog( "close" ); 
    4164                                                             }, 
    4165                                                             "Importar" : function(){ 
    4166                                                                     $.ajax({ 
    4167                                                                         url: "controller.php?action="+import_url+'&from_ajax=true&selected='+$("#select-agenda option:selected").val()+'&status='+$("#select-status option:selected").val()+'&uidAccount='+decodeOwner(), 
    4168                                                                         success: function(msg){ 
    4169                                                                             var alt = ( (msg = connector.unserialize(msg)) == "ok") ? "Importado com sucesso para " : "Ocorreu um erro ao importar o evento para a agenda "; 
    4170                                                                             alert( alt + $("#select-agenda option:selected").text() ); 
    4171                                                                         } 
    4172                                                                     }); 
    4173                                                                     $( this ).dialog( "close" ); 
    4174                                                             } 
    4175                                                         } 
    4176                                                         }); 
    4177  
    4178                                                         if(typeImport == 7){ 
    4179                                                             $("#import-dialog").find('#select-status option[value=1]').attr('selected','selected').trigger('change'); 
    4180                                                             $("#import-dialog").find('#select-status').attr('disabled','disabled'); 
    4181                                                         } 
    4182                                                     break; 
    4183                                                 case 3: 
    4184                                                         $.ajax({ 
    4185                                                                 url: "controller.php?action="+import_url+'&from_ajax=true&selected=true', 
    4186                                                                 success: function(msg){ 
    4187                                                                         alert( ( ( connector.unserialize(msg)) == "ok") ? "Seu evento foi removido " : "Ocorreu um erro ao remover o evento" ); 
    4188                                                                 } 
    4189                                                         }); 
    4190                                                         return; 
    4191                                                         break;   
    4192                                                 case 5: 
    4193                                                         $.ajax({ 
    4194                                                                 url: "controller.php?action="+import_url+'&from_ajax=true&selected=true', 
    4195                                                                 success: function(msg){ 
    4196                                                                         alert( ( ( connector.unserialize(msg)) == "ok") ? "Seu evento foi Atualizado com sucesso" : "Ocorreu um erro ao atualizar evento" ); 
    4197                                                                 } 
    4198                                                         }); 
    4199                                                         return; 
    4200                                                         break;   
    4201                                                 case 6: 
    4202                                                         var acceptedSuggestion = confirm("Deseja atualizar o evento de acordo com a sugestão ?"); 
    4203                                                         $.ajax({ 
    4204                                                                 url: "controller.php?action="+import_url+'&from_ajax=true&id_user='+User.me.id+'&selected=true&cirus_delimiter='+cyrus_delimiter+'&acceptedSuggestion='+acceptedSuggestion+"&from="+document.getElementById('from_values_'+currentTab).value+'&uidAccount='+decodeOwner(), 
    4205                                                                 success: function(msg){ 
    4206                                                                         if(acceptedSuggestion) 
    4207                                                                                 alert( ( ( connector.unserialize(msg)) == "ok") ? "Evento atualizado com sucesso " : "Ocorreu um erro ao atualizar o evento" ); 
    4208                                                                 } 
    4209                                                         }); 
    4210                                                         return; 
    4211                                                         break; 
    4212                                                 case 9: 
    4213                                                         alert('Seu evento não possui alterações!'); 
    4214                                                         return; 
    4215                                                         break; 
    4216                                                 case 11: 
    4217                                                         alert('Este evento já fora importando por algum dos particpantes e já se encontra disponível em sua agenda compartilhada!'); 
    4218                                                         return; 
    4219                                                         break; 
    4220                                                 default: 
    4221                                                         up = true; 
    4222                                                         $("#select-agenda").css("display", "none"); 
    4223                                                         $("#import-dialog" ).children("p:first-child").css("display", "none"); 
    4224                                                         $("#import-dialog" ).dialog({ 
    4225                                                                 height: 160, 
    4226                                                                 title: 'Atualizar Evento', 
    4227                                                                 buttons: { 
    4228                                                                         Cancel: function() { 
    4229                                                                                 $( this ).dialog( "close" ); 
    4230                                                                         }, 
    4231                                                                    "Atualizar": function() { 
    4232                                                                                  
    4233                                                                                 $.ajax({ 
    4234                                                                                          url: "controller.php?action="+import_url+'&from_ajax=true&cirus_delimiter='+cyrus_delimiter+'&selected='+ (parseInt(typeImport) == 2 || parseInt(typeImport) == 4 ? 'true' : $("#select-agenda option:selected").val()) +'&status='+$("#select-status option:selected").val()+'&uidAccount='+decodeOwner(), 
    4235                                                                                          success: function(msg){ 
    4236                                                                                                         alert( ( (msg = connector.unserialize(msg)) == "ok") ? "Atualizado com sucesso" : "Ocorreu um erro ao atualizar o evento" ); 
    4237                                                                                         } 
    4238                                                                                 }); 
    4239                                                                                 $( this ).dialog( "close" ); 
    4240                                                                         } 
    4241                                                                 }, 
    4242                                 close:function(event, ui)  
    4243                                 { 
    4244                                     if(typeof(shortcut) != 'undefined') shortcut.disabled = false;  
    4245                                 }, 
    4246                                 open: function(event, ui)  
    4247                                 { 
    4248                                     if(typeof(shortcut) != 'undefined') shortcut.disabled = true;  
    4249                                 } 
    4250                                                         }); 
    4251                                                         $(".ui-dialog-buttonpane").find(".ui-button:last").children().html("Atualizar"); 
     4395                                                }, 
     4396                                                close:function(event, ui)  
     4397                                                { 
     4398                                                    if(typeof(shortcut) != 'undefined') shortcut.disabled = false;  
     4399                                                }, 
     4400                                                open: function(event, ui)  
     4401                                                { 
     4402                                                    if(typeof(shortcut) != 'undefined') shortcut.disabled = true;  
    42524403                                                } 
    4253                                                 $( "#import-dialog" ).dialog( "open" );  
    4254                                                                                                                                  
    4255                                         }; 
    4256                                         createDialog(data, true); 
    4257                                  
    4258                 }, 
    4259                 beforeSend: function( jqXHR, settings ){ 
    4260                                         connector.showProgressBar(); 
    4261                                 }, 
    4262                                 complete: function( jqXHR, settings ){ 
    4263                                         connector.hideProgressBar(); 
    4264                                 } 
    4265             }); 
    4266                          
    4267                 } 
    4268                 else 
    4269                 { 
    4270                     if(confirm(get_lang("Do you confirm this import to your Calendar?"))){ 
    4271                         cExecute( import_url + "&from_ajax=true", handler_import_calendar); 
    4272                     } 
    4273                 } 
    4274 } 
     4404                                            }); 
     4405                                            $(".ui-dialog-buttonpane").find(".ui-button:last").children().html("Atualizar"); 
     4406                                    } 
     4407                                    $( "#import-dialog" ).dialog( "open" ); 
     4408                                                                                                                                    
     4409                                }; 
     4410                                createDialog(data, true); 
     4411                                    
     4412                            }, 
     4413                            beforeSend: function( jqXHR, settings ){ 
     4414                                connector.showProgressBar(); 
     4415                            }, 
     4416                            complete: function( jqXHR, settings ){ 
     4417                                connector.hideProgressBar(); 
     4418                            } 
     4419                        });     
     4420                    } 
     4421                    else 
     4422                    { 
     4423                        if(confirm(get_lang("Do you confirm this import to your Calendar?"))){ 
     4424                            cExecute( import_url + "&from_ajax=true", handler_import_calendar); 
     4425                        } 
     4426                    } 
     4427    } 
     4428     
    42754429function open_msg_part(data){ 
    42764430        var handler_open_msg_part = function (data) 
  • trunk/expressoMail1_2/setup/phpgw_pt-br.lang

    r6952 r6996  
    135135Do you really want to empty your trash folder?  expressoMail1_2 pt-br   Você tem certeza que deseja limpar sua lixeira? 
    136136Do you wanna receive an alert for new messages? expressoMail1_2 pt-br   Você quer receber um alerta para mensagens novas? 
     137Wish you receive notifications for: "New messages", "Filter criteria", "Event alerts"?  expressoMail1_2 pt-br   Exibir notificações de: "Nova mensagem", "Criterio atendido", "Alerta de evento"? 
    137138Do you want to automatically display the message header?        expressoMail1_2 pt-br   Você deseja exibir automaticamente o cabecalho da mensagem? 
    138139Do you want to block this e-mail?       expressoMail1_2 pt-br   Você gostaria de bloquear este e-mail? 
     
    393394Number of dynamic contacts      admin   pt-br   Número de contatos dinâmicos 
    394395Number of messages to send:     expressoMail1_2 pt-br   Número de mensagens à enviar: 
     396Notification    expressoMail1_2 pt-br   Notificação 
     397Filter criteria expressoMail1_2 pt-br   Critério de filtro 
    395398Offline Pass    expressoMail1_2 pt-br   Senha do Offline 
    396399Offline success installed       expressoMail1_2 pt-br   Offline instalado com sucesso 
     
    929932Permission denied to folder "%1".       expressoMail1_2 pt-br   Permissão negada para pasta "%1". 
    930933Success expressoMail1_2 pt-br   Concluído 
     934The contact was moved from recent contacts to personal contacts successful.     expressoMail1_2 pt-br   O Contato foi movido dos contatos recentes para os contatos pessoais com sucesso. 
  • trunk/expressoMail1_2/setup/setup.inc.php

    r6528 r6996  
    1313$setup_info['expressoMail1_2']['name'] = 'expressoMail1_2'; 
    1414$setup_info['expressoMail1_2']['title'] = 'Expresso Mail'; 
    15 $setup_info['expressoMail1_2']['version'] = '2.4.8'; 
     15$setup_info['expressoMail1_2']['version'] = '2.4.8.1'; 
    1616$setup_info['expressoMail1_2']['app_order'] = 2; 
    1717$setup_info['expressoMail1_2']['tables'][] = 'phpgw_certificados'; 
  • trunk/expressoMail1_2/setup/tables_current.inc.php

    r6528 r6996  
    7878                                'alarm_deadline' => array('type' => 'timestamp', 'nullable' => true), 
    7979                                'done_deadline' => array('type' => 'timestamp', 'nullable' => true), 
    80                                 'is_done' => array('type' => 'int', 'precision' => '8','nullable' => true) 
     80                                'is_done' => array('type' => 'int', 'precision' => '2','nullable' => true), 
     81                                'sent' => array('type' => 'int', 'precision' => '2','nullable' => false, 'default' => 0) 
    8182                        ), 
    8283                        'pk' => array('id'), 
     
    9697                                'size' => array('type' => 'int','precision' => '16','nullable' => False), 
    9798                'dtstamp' => array('type' => 'int','precision' => '16','nullable' => False), 
    98                                 'owner' => array('type' => 'int', 'precision' => '8','nullable' => True) 
     99                                'owner' => array('type' => 'int', 'precision' => '8','nullable' => True), 
     100                                 
    99101                        ), 
    100102                        'pk' => array('id'), 
  • trunk/expressoMail1_2/setup/tables_update.inc.php

    r6543 r6996  
    312312            return $GLOBALS['setup_info']['expressoMail1_2']['currentver']; 
    313313        } 
     314         
     315        $test[] = '2.4.8'; 
     316        function expressoMail1_2_upgrade2_4_8() { 
     317                $oProc = $GLOBALS['phpgw_setup']->oProc; 
     318 
     319                $oProc->query("ALTER TABLE expressomail_message_followupflag ADD COLUMN sent smallint not null default 0"); 
     320 
     321                $GLOBALS['setup_info']['expressoMail1_2']['currentver'] = '2.4.8.1'; 
     322            return $GLOBALS['setup_info']['expressoMail1_2']['currentver']; 
     323        } 
    314324?> 
  • trunk/expressoMail1_2/templates/default/index.tpl

    r6487 r6996  
    186186        </fieldset>    
    187187</div> 
    188 <div id="import-dialog" title="Importar Evento" style="display:none"> 
     188<div id="import-dialog" title="Importar Evento/Tarefa" style="display:none"> 
    189189        <p>Seleciona uma Agenda para o Evento :</p> 
    190190        <p> 
  • trunk/expressoMail1_2/templates/default/main.css

    r6930 r6996  
    898898 
    899899 
    900  
    901900/* 
    902901 * Este arquivo limpa o estilo para a nova agenda, .new-event-win.active sobrescrevendo o código CSS 
     
    928927/*      font-family: Arial,Helvetica,sans-serif;*/ 
    929928/*}*/ 
    930 .new-event-win.active:focus { 
     929.new-event-win.active:focus, .new-task-win.active:focus { 
    931930        outline: 0; 
    932931} 
    933 .new-event-win.active body { 
     932.new-event-win.active body , .new-task-win.active body { 
    934933        line-height: 1; 
    935934        color: black; 
    936935        background: white; 
    937936} 
    938 .new-event-win.active ol, .new-event-win.active ul { 
     937.new-event-win.active ol, .new-event-win.active ul , .new-task-win.active ol, .new-task-win.active ul { 
    939938        list-style: none; 
    940939        list-style-image : none; 
     
    942941} 
    943942 
    944 .new-event-win.active table { 
     943.new-event-win.active table , .new-task-win.active table { 
    945944        border-collapse: separate; 
    946945        border-spacing: 0; 
    947946} 
    948 .new-event-win.active caption, .new-event-win.active th, .new-event-win.active td { 
     947.new-event-win.active caption, .new-event-win.active th, .new-event-win.active td, .new-task-win.active caption, .new-task-win.active th, .new-task-win.active td { 
    949948        /*text-align: left;*/ 
    950949        font-weight: normal; 
    951950} 
    952951.new-event-win.active blockquote:before, .new-event-win.active blockquote:after, 
    953 .new-event-win.active q:before, .new-event-win.active q:after { 
     952.new-event-win.active q:before, .new-event-win.active q:after, 
     953.new-task-win.active blockquote:before, .new-task-win.active blockquote:after, 
     954.new-task-win.active q:before, .new-task-win.active q:after { 
    954955        content: ""; 
    955956} 
    956 .new-event-win.active blockquote, .new-event-win.active q { 
     957.new-event-win.active blockquote, .new-event-win.active q , 
     958.new-task-win.active blockquote, .new-task-win.active q  
     959{ 
    957960        quotes: "" ""; 
    958961} 
    959 .new-event-win.active .mail.name-special, .new-event-win.active .name.name-special{ 
     962.new-event-win.active .mail.name-special, .new-event-win.active .name.name-special, 
     963.new-task-win.active .mail.name-special, .new-task-win.active .name.name-special 
     964{ 
    960965  padding: 0 0 0 35px; 
    961966} 
    962967 
    963 .new-event-win.active .add-attendee-search.search-field { 
     968.new-event-win.active .add-attendee-search.search-field , 
     969.new-task-win.active .add-attendee-search.search-field  
     970{ 
    964971  width: 249px; 
    965972 } 
    966973  
    967  .new-event-win.active #calendar_addevent_details4 { 
     974 .new-event-win.active #calendar_addevent_details4, .new-task-win.active #calendar_addtask _details4 { 
    968975  margin: 10px 0 0 0; 
    969976 }  
    970977  
    971  .new-event-win.active input{ 
     978 .new-event-win.active input, .new-task-win.active input{ 
    972979  color: #000; 
    973980 }  
    974981  
    975  .new-event-win.active #calendar_addevent_details5 { 
     982 .new-event-win.active #calendar_addevent_details5 , .new-task-win.active #calendar_addtask_details5 { 
    976983  margin: 10px 0 11px 0; 
    977984 } 
    978985 
    979 .new-event-win.active select { 
     986 .new-event-win fieldset.tab-level2, .new-task-win fieldset.tab-level2 { padding: 0px 5px; min-height: 110px; max-height: 310px; overflow: hidden;} 
     987  
     988.new-event-win.active select , .new-task-win.active select { 
    980989    border: 1px solid #CFCFCF; 
    981990    border-color: #CFCFCF; 
     
    983992    background-color: #FFF; 
    984993} 
    985 .new-event-win.active a:link, .new-event-win.active a:visited { 
     994.new-event-win.active a:link, .new-event-win.active a:visited  
     995.new-task-win.active a:link, .new-task-win.active a:visited 
     996{ 
     997 
    986998    color: #2E6E9E; 
    987999} 
    9881000 
    989 .new-event-win.active  dd, .new-event-win.active  dl, .new-event-win.active  dt{ 
     1001.new-event-win.active  dd, .new-event-win.active  dl, .new-event-win.active  dt,  
     1002.new-task-win.active  dd, .new-task-win.active  dl, .new-task-win.active  dt 
     1003{ 
    9901004        margin: 0; 
    9911005} 
     
    10011015{ color: #ff9933; }*/ 
    10021016 
    1003 .new-event-win.active #divAppbox{ 
     1017.new-event-win.active #divAppbox 
     1018.new-task-win.active #divAppbox 
     1019{ 
    10041020        overflow-x: auto; 
    10051021        overflow-y: scroll; 
     
    10071023 
    10081024.new-event-win.active select 
     1025.new-task-win.active select 
    10091026{ border-color: #CFCFCF; color: #555; padding-left:0px;} 
    10101027 
     
    10451062} 
    10461063 
     1064div.new-event-win.active div.button-files-upload {margin: 15px 0 0 0;} 
     1065 
    10471066fieldset.alarm{   
    10481067    border: none !important; 
     
    10511070} 
    10521071 
    1053 div.new-event-win.active div.button-files-upload{ 
    1054     margin: 15px 0 0 0; 
    1055 } 
    1056  
    1057 div.new-event-win.active div.files-list{ 
    1058     margin: 45px 0 0 0; 
     1072.new-task-win dl.block-add-attendee{ 
     1073        width: 350px; 
     1074} 
     1075.new-task-win.active .add-attendee-search.search-field{ 
     1076        width: 322px; 
     1077} 
     1078 
     1079.new-task-win .menu-container.footer-container{ 
     1080        width: 774px; 
    10591081} 
    10601082 
     
    11701192        border-top: 0px; 
    11711193}*/ 
    1172  
    11731194 
    11741195 
     
    14231444 
    14241445.fileupload_msg_tooltip{ 
    1425         width: 99.7%; 
    1426         text-align: center; 
    1427         background: #DFEFFC; 
    1428         font-weight: bold; 
    1429         border-radius: 5px; 
     1446    width: 99.7%; 
     1447    text-align: center; 
     1448    background: #DFEFFC; 
     1449    font-weight: bold; 
     1450    border-radius: 5px; 
    14301451    height: 115px; 
    14311452    line-height: 115px; 
     
    14571478    background-color: #5194d2; 
    14581479} 
     1480 
     1481/*freeow*/ 
     1482div.gray.alarmDeadline .button.delete 
     1483{ 
     1484/* 
     1485        display: block; 
     1486        position: absolute; 
     1487        right: 19px; 
     1488        top: 50px; 
     1489        */ 
     1490} 
     1491 
     1492/*div.gray.alarmDeadline ul.message-list{overflow: hidden;}*/ 
     1493 
     1494/*div.gray.alarmDeadline ul.message-list li{ margin: 5px 0;}*/ 
     1495 
     1496div.gray li{float: left; width: 253px;} 
     1497 
     1498div.gray li a.button.delete{float: right;} 
     1499 
     1500 
     1501.div-addtask #calendar_addtask_details1 .h1{ 
     1502  width: 100%; 
     1503} 
     1504 
     1505.div-addtask #calendar_addtask_details2 textarea { 
     1506  width: 675px; 
     1507} 
     1508 
     1509.div-addtask .button-files-upload{width: 100%;} 
     1510.div-addtask fieldset.block-add-attendee .search-result-list, fieldset.block-add-activity .search-result-list{width: 330px;} 
     1511 
     1512.new-event-win div.div-addevent, .new-task-win div.div-addtask{width: 775px;} 
     1513 
     1514.calendar-addevent-details-txt-timezone, .calendar-addtask-details-txt-timezone{width: 212px;}  
     1515 
     1516.div-addtask #calendar_addtask_details1 .time-previsao { width: 40px; } 
     1517 
     1518.div-addtask #calendar_addtask_details1 .date-previsao{ width: 80px; } 
     1519 
     1520.div-addtask #calendar_addtask_details6{ width: 756px; } 
     1521.div-addtask #calendar_addtask_details1 .start-time{ width: 40px; } 
     1522.div-addtask #calendar_addtask_details1 .start-date{ width: 80px; } 
     1523.div-addtask #calendar_addtask_details1 .end-time{ width: 40px; } 
     1524.div-addtask #calendar_addtask_details1 .end-date{ width: 80px; } 
     1525.div-addtask #calendar_addtask_details1 .previsao-termino { margin: 0 0 0 20px; } 
     1526.div-addtask #calendar_addtask_details1 .subitem { margin: 5px; display: block;} 
     1527.div-addtask #calendar_addtask_details1 .subitem .span_done{ margin: 0 30px;} 
     1528.div-addtask #calendar_addtask_details1 .subitem .span_done img{position: relative; top:4px; width:16px; height:16px;} 
     1529.div-addtask #calendar_addtask_details1 .calendar_addevent_details_lnk_timezone { margin: 0 0 0 20px;} 
     1530.div-addtask #calendar_addtask_details1 .subitem .done { width: 45px;} 
     1531.div-addtask #calendar_addtask_details1 .ui-spinner-buttons{ top: -2px !important;} 
     1532.div-addtask #calendar_addtask_details1 .ui-spinner-buttons .ui-spinner-up{height: 7px !important;} 
     1533.div-addtask #calendar_addtask_details1 .ui-spinner-buttons .ui-spinner-down{height: 8px !important;} 
     1534 
     1535.div-addtask #calendar_addtask_details1 .subitem .span_done.noAction{background-image: url("../../../prototype/modules/calendar/img/gray.png"); background-repeat: no-repeat; } 
     1536.div-addtask #calendar_addtask_details1 .subitem .span_done.inProcess{background-image: url("../../../prototype/modules/calendar/img/yellow.png"); background-repeat: no-repeat;} 
     1537.div-addtask #calendar_addtask_details1 .subitem .span_done.finished{background-image: url("../../../prototype/modules/calendar/img/green.png"); background-repeat: no-repeat;} 
     1538.div-addtask #calendar_addtask_details1 .subitem .span_done.canceled{background-image: url("../../../prototype/modules/calendar/img/red.png"); background-repeat: no-repeat;} 
     1539 
     1540#calendar_addtask_details4{margin: 0;} 
     1541#calendar_addtask_details5{margin: -2px 0 0 0;} 
     1542#calendar_addtask_details7{margin: 3px 0 0 0;} 
     1543.div-addtask #calendar_addtask_details1 .subitem .span_done label{position: relative; left: 28px;} 
     1544 
     1545.div-addtask fieldset#calendar_addtask_details5.tab-level2{ margin: 0 } 
     1546 
     1547.div-addtask  #calendar_addtask_details8 .parent {width: 746px; min-height: 208px; float: left;} 
     1548/*.div-addtask  #calendar_addtask_details8 .parent .child-top {width: 745px; height: 20px; background: #E8F4FD; border-left: 1px solid #CCC; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC;}*/ 
     1549.div-addtask  #calendar_addtask_details8 .parent .child-top {width: 745px; height: 25px; background: #E8F4FD; border-left: 1px solid #CCC; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC; border-top: 1px solid #CCC;} 
     1550.div-addtask  #calendar_addtask_details8 .parent .child-bottom {width: 745px; height: 208px; overflow: auto;  float: left; border-left: 1px solid #CCC; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC;} 
     1551.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each { height: 20px; } 
     1552.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each:hover { background: #FFF2F2; cursor: pointer;} 
     1553 
     1554.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .date-hour {overflow: hidden; width: 140px; float: left; height: 20px} 
     1555.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .date-hour span { margin: 8px; float: left; } 
     1556.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .user{overflow: hidden; width: 150px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     1557.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .user span{ margin: 8px; float: left; } 
     1558.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .attribute{overflow: hidden; width: 130px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     1559.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .attribute span{ margin: 8px; float: left; } 
     1560.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .beforeValue{overflow: hidden; width: 150px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     1561.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .beforeValue span{ margin: 8px; float: left; } 
     1562.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .afterValue{overflow: hidden; width: 150px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     1563.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .afterValue span{ margin: 8px; float: left; } 
     1564 
     1565.div-addtask  #calendar_addtask_details8 .parent .child-top .date-hour { width: 140px; float: left; background: #E8F4FD; height: 20px; text-align: center; } 
     1566.div-addtask  #calendar_addtask_details8 .parent .child-top .date-hour span{ display: block; padding: 6px; font-weight: bold; color: #2E6E9E; } 
     1567.div-addtask  #calendar_addtask_details8 .parent .child-top .user { width: 150px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E; text-align: center;} 
     1568.div-addtask  #calendar_addtask_details8 .parent .child-top .user span{display: block; padding: 6px;} 
     1569.div-addtask  #calendar_addtask_details8 .parent .child-top .attribute { width: 130px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
     1570.div-addtask  #calendar_addtask_details8 .parent .child-top .attribute span{display: block; padding: 6px;} 
     1571.div-addtask  #calendar_addtask_details8 .parent .child-top .beforeValue { width: 150px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
     1572.div-addtask  #calendar_addtask_details8 .parent .child-top .beforeValue span{display: block; padding: 6px; } 
     1573.div-addtask  #calendar_addtask_details8 .parent .child-top .afterValue { width: 150px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
     1574.div-addtask  #calendar_addtask_details8 .parent .child-top .afterValue span{display: block; padding: 6px; } 
  • trunk/prototype/config/calendar.ini

    r5592 r6996  
    1919id = "id" 
    2020name = "name" 
     21type = "type" 
    2122location = "location" 
    2223timezone = "tzid" 
  • trunk/prototype/config/calendarSignature.ini

    r5514 r6996  
    1313createDefaultSignature = modules/calendar/interceptors/DBMapping.php 
    1414deepnessFindCalendarSignature = modules/calendar/interceptors/DBMapping.php 
     15createDefaultGroup = modules/calendar/interceptors/DBMapping.php 
    1516 
    1617[after.read] 
     
    2223calendar = calendar_id 
    2324isOwner = is_owner 
     25type = type 
    2426msgAdd = msg_add 
    2527msgCancel = msg_cancel 
  • trunk/prototype/config/followupflagged.ini

    r6016 r6996  
    3232doneDeadline = done_deadline 
    3333isDone = is_done 
     34isSent = sent 
    3435borderColor = border_color 
    3536backgroundColor = background_color 
  • trunk/prototype/config/participant.ini

    r6111 r6996  
    1919deepnessReadParticipant = modules/calendar/interceptors/DBMapping.php 
    2020 
     21[after.create] 
     22createParticipantHistoric = modules/calendar/interceptors/DBMapping.php 
     23 
     24[before.delete] 
     25prepareParticipantHistoric = modules/calendar/interceptors/DBMapping.php 
     26 
     27[after.delete] 
     28removeParticipantHistoric = modules/calendar/interceptors/DBMapping.php 
     29 
    2130[after.commit] 
    2231commitParticipant = modules/calendar/interceptors/Notifications.php 
     32 
    2333 
    2434[PostgreSQL.mapping] 
  • trunk/prototype/config/schedulable.ini

    r6190 r6996  
    55participants = participant.schedulable 
    66attachments = schedulableToAttachment.schedulable 
     7taskToActivity = taskToActivity.activity 
    78         
    89[model.hasOne] 
     
    1718[before.find] 
    1819findSchedulable = modules/calendar/interceptors/DBMapping.php 
     20findTask = modules/calendar/interceptors/DBMapping.php 
    1921 
    2022[after.find] 
     
    2628updateEvent = modules/calendar/interceptors/Notifications.php 
    2729 
    28  
    2930[after.update] 
    3031putEvent = modules/calendar/interceptors/DBMapping.php 
     32createHistoric = modules/calendar/interceptors/DBMapping.php 
    3133 
    3234[after.read] 
     
    5658sequence = sequence 
    5759timezone = tzid 
     60priority = priority 
     61percentage = percentage 
     62status = status 
     63due = due 
  • trunk/prototype/config/schedulableToAttachment.ini

    r6369 r6996  
    55schedulable = schedulable.attachments 
    66 
     7[after.create] 
     8createAttachmentHistoric = modules/calendar/interceptors/DBMapping.php 
     9 
    710[before.delete] 
    811decodeSchedulablettachment = modules/calendar/interceptors/DBMapping.php 
    912 
    1013[after.delete] 
     14removeAttachmentHistoric = modules/calendar/interceptors/DBMapping.php 
    1115deleteAttachmentDependences = modules/calendar/interceptors/DBMapping.php 
    1216 
  • trunk/prototype/modules/calendar/constants.php

    r6861 r6996  
    22 
    33define('EVENT_ID', 1); 
     4define('TASK_ID', 2); 
     5 
     6define('SIGNATURE_TYPE_NORMAL', 0); 
     7define('SIGNATURE_TYPE_DEFAULT', 1); 
     8 
     9define('CALENDAR_TYPE_EVENT', 0); 
     10define('CALENDAR_TYPE_TASK_GROUP', 1); 
    411 
    512define('STATUS_CONFIRMED', 1); 
     
    5057define('CALENDAR_ACL_SHARED', 's'); 
    5158define('CALENDAR_ACL_REQUIRED', 'p'); 
     59 
     60define('PRIORITY_HIGH', 1); 
     61define('PRIORITY_NORMAL', 2); 
     62define('PRIORITY_LOW', 3); 
     63 
     64define('STATUS_TODO_NEED_ACTION', 1); 
     65define('STATUS_TODO_IN_PROGRESS', 2); 
     66define('STATUS_TODO_COMPLETED', 3); 
     67define('STATUS_TODO_CANCELLED', 4); 
    5268?> 
  • trunk/prototype/modules/calendar/css/layout.css

    r6944 r6996  
    217217/* -- event details styles -- */ 
    218218 
    219 .new-event-win.active { 
     219.new-event-win.active, .new-task-win.active { 
    220220         width:700px;height:510px;text-align:left; 
    221221} 
    222222 
    223 .new-event-win > .content.ui-tabs.ui-widget-content { 
     223.new-event-win > .content.ui-tabs.ui-widget-content, .new-task-win > .content.ui-tabs.ui-widget-content { 
    224224        border: none; 
    225225} 
    226226 
    227 .new-event-win ul.attendee-permissions-list, li.attendee-permissions-list{text-align: left;} 
     227.new-event-win ul.attendee-permissions-list, li.attendee-permissions-list, .new-task-win ul.attendee-permissions-list{text-align: left;} 
     228.new-activity-win.active { 
     229         width:700px;height:510px;text-align:left; 
     230} 
     231 
     232.new-activity-win > .content.ui-tabs.ui-widget-content { 
     233        border: none; 
     234} 
     235.new-activity-win ul.attendee-permissions-list, li.attendee-permissions-list{text-align: left;} 
    228236 
    229237li.attendee-permissions-list input{width: 20px !important; margin: 3px 0 0 0 !important;} 
     
    234242p.request-update label{width: 150px !important;} 
    235243 
    236 .new-event-win .menu-addevent { 
     244.new-event-win .menu-addevent, .new-task-win .menu-addevent { 
    237245        text-align: right; 
    238246} 
    239247 
    240 fieldset.block-add-attendee .add-attendee-search { max-width: 250px; margin: 5px;} 
    241 fieldset.block-add-attendee .add-attendee-search input { max-width: 220px; width: 220px; padding: 0 0 0 7px;} 
    242 fieldset.block-add-attendee .search-result-list { width: 255px; max-height: 215px; overflow: auto;} 
    243 fieldset.block-add-attendee .search-result-list .ui-widget-content { border: none;} 
    244 fieldset.block-add-attendee .search-result-list .empty { margin-left: 5px; } 
     248.new-event-win fieldset.block-add-attendee .add-attendee-search { max-width: 250px; margin: 5px;} 
     249.new-task-win fieldset.block-add-attendee .add-attendee-search { max-width: 323px; margin: 5px;} 
     250 
     251.new-event-win fieldset.block-add-attendee .add-attendee-search input { max-width: 220px; width: 220px; padding: 0 0 0 7px;} 
     252.new-task-win fieldset.block-add-attendee .add-attendee-search input { max-width: 290px; width: 290px; padding: 0 0 0 7px;} 
     253 
     254.new-activity-win .menu-addevent {      text-align: right; } 
     255fieldset.block-add-attendee .add-attendee-search, fieldset.block-add-activity .add-activity-search { max-width: 250px; margin: 5px;} 
     256fieldset.block-add-attendee .add-attendee-search input, fieldset.block-add-activity .add-activity-search input { max-width: 220px; width: 220px; padding: 0 0 0 7px;} 
     257fieldset.block-add-attendee .search-result-list, fieldset.block-add-activity .search-result-list { width: 255px; max-height: 215px; overflow: auto;} 
     258fieldset.block-add-attendee .search-result-list .ui-widget-content, fieldset.block-add-activity .search-result-list .ui-widget-content { border: none;} 
     259fieldset.block-add-attendee .search-result-list .empty, fieldset.block-add-activity .search-result-list .empty { margin-left: 5px; } 
    245260fieldset.block-add-user .add-user-search {max-width: 235px;} 
    246261fieldset.block-add-user .search-result-list {max-width: 245px;}  
    247 fieldset.block-add-user .search-result-list .ui-widget-content {/*max-width: 245px;*/} 
    248  
    249 .block-attendee-list, .block-add-attendee { float:left;} 
     262 
     263fieldset.block-add-user .search-result-list .ui-widget-content, fieldset.block-add-user .search-result-list .ui-widget-content {max-width: 245px;} 
     264 
     265#calendar_addactivity_details8 .block-attendee-list, #calendar_addactivity_details8 .block-activity-list { width:430px; margin-right: 5px; } 
     266 
     267.block-activity-list, .block-activity-group-select{width: 405px} 
     268.block-add-activity.search{width: 298px} 
     269 
     270.block-attendee-list, .block-activity-list, .block-add-activity, .block-activity-group-select { float:left;} 
    250271.block-attendee-list { width:400px; margin-right: 5px; } 
    251 .block-add-attendee { width:260px; margin-right: 5px; } 
    252 .block-attendee-list dd, .block-add-attendee dd { border: 1px solid #BFBFBF; } 
    253 .block-attendee-list dt, .block-add-attendee dt { background-color:#FFF; margin: 5px 0 -6px 5px; font-weight: bold; display: table;  position: relative;} 
     272.new-event-win .block-add-attendee { width:260px; margin-right: 5px; } 
     273.new-task-win .block-add-attendee { width:335px; margin-right: 5px; } 
     274.block-attendee-list dd, .block-add-attendee dd, .block-activity-list dd, .block-add-activity dd, .block-activity-group-select dd { border: 1px solid #BFBFBF; } 
     275.block-attendee-list dt, .block-add-attendee dt,.block-activity-list dt, .block-add-activity dt, .block-activity-group-select dt { background-color:#FFF; margin: 5px 0 -6px 5px; font-weight: bold; display: table;  position: relative; display: table;} 
    254276.block-attendee-list dd.attendee-list { height: 196px; } 
    255 .block-attendee-list dd.attendee-list ul { max-height: 186px; overflow: auto; margin-top: 10px;} 
    256 .block-attendee-list dd.attendee-list-add {border-top:none !important; border:1px solid #BFBFBF;} 
    257 .block-attendee-list dd.attendee-list-add fieldset.add-attendee-input { border:none !important; margin: 0; padding: 0 } 
    258 .block-attendee-list dd.attendee-list-brief { border:none !important; margin: 5px 0; color:#777; } 
    259  
    260 dl.block-add-attendee { 
     277.block-attendee-list dd.attendee-list ul, .block-activity-list dd.task-activity-list ul { max-height: 186px; overflow: auto; margin-top: 10px;} 
     278.block-attendee-list dd.attendee-list-add, .block-activity-list dd.activity-list-add {border-top:none !important; border:1px solid #BFBFBF;} 
     279.block-attendee-list dd.attendee-list-add fieldset.add-attendee-input, .block-activity-list dd.activity-list-add fieldset.add-activity-input { border:none !important; margin: 0; padding: 0 } 
     280.block-attendee-list dd.attendee-list-brief, .block-activity-list dd.activity-list-brief { border:none !important; margin: 5px 0; color:#777; } 
     281#calendar_addactivity_details8 .block-attendee-list, #calendar_addactivity_details8 .block-activity-list { width:430px; margin-right: 5px; } 
     282 
     283/* Pesquisa de tarefas */ 
     284.block-activity-group-select dd.task-activity-list { height: 181px; } 
     285.block-activity-group-select dd.group-select { height: 40px; } 
     286 
     287fieldset.block-add-activity ul.search-result-list li{ width: 9999px; } 
     288fieldset.block-add-activity ul.search-result-list{width: 290px;} 
     289 
     290fieldset.block-add-activity fieldset.add-activity-search{max-width: 320px; width: 282px} 
     291fieldset.block-add-activity fieldset.add-activity-search input{max-width: 260px; width: 245px;} 
     292 
     293.block-activity-group-select dd.group-select select{margin: 12px 8px;} 
     294.block-activity-group-select dd.task-activity-list{padding: 10px 5px} 
     295 
     296/** Pesquisa de tarefas **/ 
     297 
     298select.group-addactivity-details-txt-timezone{width: 175px;} 
     299 
     300 
     301dl.block-add-attendee, dl.block-add-activity { 
    261302        float: right; 
    262303        display: block; 
    263304} 
    264305 
    265 dl.block-add-attendee dd.add-attendee { 
     306dl.block-add-activity dd.add-activity{ 
     307    width: 295px; 
     308    min-height: 254px; 
     309    display: block; 
     310} 
     311 
     312.new-event-win dl.block-add-attendee dd.add-attendee{ 
    266313        width: 260px; 
    267314        min-height: 260px; 
    268315        display: block; 
    269316} 
     317 
     318.new-task-win dl.block-add-attendee dd.add-attendee { 
     319        width: 343px; 
     320        min-height: 260px; 
     321        display: block; 
     322} 
     323 
     324.new-activity-win dl.block-activity-group-select li.task{overflow: hidden; position: relative;} 
     325.new-activity-win dl.block-activity-group-select ul{overflow: hidden;} 
     326 
     327#calendar_addactivity_details8 dl.block-add-attendee dd.add-attendee ,#calendar_addactivity_details8 dl.block-add-activity dd.add-activity { 
     328        width: 260px; 
     329        min-height: 292px; 
     330        display: block; 
     331} 
     332 
    270333 
    271334ul.attendees-count {clear:left; float:left;} 
     
    280343.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;} 
    281344 
    282 .attendees-list .me .add-attendee-options-button {position: absolute; top: 171px;} 
     345.attendees-list .me .add-attendee-options-button {top: 4px;} 
    283346.attendees-list .hover-attendee { background-color: #DFEFFC;} 
     347.task-activity-list .hover-activity { background: #DFEFFC;} 
    284348/* 
    285349.attendees-list .attendee-options-button-edit { position: absolute; top:0; right:25px;} 
     
    288352*/ 
    289353 
    290 .attendee-options{ position: absolute; top: 0; left: 287px; background-color: white; z-index: 100; width: 90px; background-color: #FFF; padding: 0 20px 0 3px; text-align: right;} 
    291 .attendees-list .not-attendee { height:16px; } 
     354.attendee-options, .activity-options{ position: absolute; top: 0; left: 287px; background-color: white; z-index: 100; width: 90px; background-color: #FFF;      padding: 0 20px 0 3px; text-align: right;} 
     355.attendees-list .not-attendee, .activitys-list .not-activity { height:16px; } 
    292356 
    293357.list-delegates{margin: 0 0 0 25px;} 
     
    296360 
    297361.attendees-list .me .add-attendee-search input { max-width: 125px; } 
    298 .attendees-list li.organizer, .attendees-list li.me-delegated  {margin-bottom: 3px;} 
     362.attendees-list li.organizer, .attendees-list li.me-delegated, .activitys-list li.organizer {margin-bottom: 3px;} 
    299363.attendees-list .organizer .button.swap { 
    300364        float: right; 
     
    338402} 
    339403dd.attendee-list ul.attendee-list li label[title=''] { display:none } 
     404dd.task-activity-list ul.task-activity-list li { 
     405    overflow: hidden; 
     406        position: relative; 
     407} 
     408 
     409 
     410dd.task-activity-list ul.task-activity-list li label.name, 
     411dd.task-activity-list ul.task-activity-list li label.mail { 
     412        width: 99999px; 
     413        min-width: 99999px; 
     414} 
     415 
     416 ul.task-activity-list li label.name{display: table-cell;} 
     417 
     418dd.task-activity-list ul.task-activity-list li label[title=''] { display:none } 
    340419/* 
    341420dd.attendee-list ul.attendee-list li .button.close { 
     
    404483/* -- calendar list styles -- */ 
    405484 
    406 .my-calendars .button.new { 
     485.my-calendars .button.new, .my-groups-task .button.new{ 
    407486  float:right; 
    408487  width: 15px; 
     
    410489} 
    411490 
    412 .my-calendars .status-list { 
     491.my-calendars .status-list, .my-groups-task  .status-list { 
    413492        display: inline-block; 
    414493        margin: 0px 0pc -4px -5px; 
     
    416495} 
    417496 
    418 .my-calendars .list-calendars-item, .signed-calendars .list-calendars-item{ 
     497.my-calendars .list-calendars-item, .signed-calendars .list-calendars-item, .my-groups-task .list-calendars-item{ 
    419498        position: relative;  
    420499        overflow: hidden; 
    421500} 
    422 .my-calendars .list-calendars-item div, .signed-calendars .list-calendars-item div{ 
     501.my-calendars .list-calendars-item div, .signed-calendars .list-calendars-item div, .my-groups-task .list-calendars-item div{ 
    423502        overflow:hidden;  
    424503        width:6000px;  
     
    426505} 
    427506 
    428 .my-calendars .cal-list-options-btn, .signed-calendars .cal-list-options-btn { 
     507.my-calendars .cal-list-options-btn, .signed-calendars .cal-list-options-btn, .my-groups-task .cal-list-options-btn { 
    429508        position: absolute; 
    430509        top: 2px; 
     
    714793 
    715794.button.add.button-add-attachment{margin: -9px 0 0 8px;} 
    716 .button.btn-danger.delete{margin: 0 0 0 0;} 
     795.button.btn-success.fileinput-button{width: 85px;} 
     796.button.btn-danger.delete{margin: 0 0 0 0; min-width: 143px;} 
    717797 
    718798.button.upload{top: 4px;} 
     
    729809.lbl-archive-nome{width:40px !important;} 
    730810.row.fileupload-buttonbar{margin-top: -14px; padding: 0.2em 0.7em;} 
     811.row.fileupload-buttonbar-task{margin-top: 0; padding: 0.2em 0.7em;} 
    731812 
    732813.archive-nome{width: 73px;} 
     
    745826/* -- alarm dysplay -- */ 
    746827 
    747 .new-event-alarm{ 
     828.new-event-alarm, .new-task-alarm{ 
    748829        margin: 5px;     
    749830        font: bold; 
    750831} 
    751832 
    752 .title-event-alarm{ 
     833.title-event-alarm, .title-task-alarm{ 
    753834        margin: 5px; 
    754835} 
    755836 
    756 .description-event-alarm{ 
     837.description-event-alarm, .description-task-alarm{ 
    757838        margin: 5px; 
    758839} 
    759840 
    760 .inicialize-event-alarm{ 
     841.inicialize-event-alarm, .inicialize-task-alarm{ 
    761842        margin: 5px; 
    762843} 
     
    861942.ui-dialog .ui-button-text-only .ui-button-text { padding: 0.4em 1em; } 
    862943 
    863 .new-event-win fieldset { border: none; margin: 0; padding: 0; } 
    864 .new-event-win fieldset.tab-level2 { padding: 0px 5px; } 
    865 .new-event-win fieldset fieldset, .new-event-win fieldset.tab-level2 fieldset { padding: 5px 0; } 
     944.new-event-win fieldset, .new-task-win fieldset { border: none; margin: 0; padding: 0; } 
     945.new-event-win fieldset.tab-level2, .new-task-win fieldset.tab-level2 { padding: 0px 5px; } 
     946.new-event-win fieldset fieldset, .new-task-win fieldset.tab-level2 fieldset, 
     947.new-task-win fieldset fieldset, .new-task-win fieldset.tab-level2 fieldset{ padding: 5px 0; } 
     948 
     949.new-activity-win fieldset { border: none;      margin: 0; padding: 0; } 
     950.new-activity-win fieldset.tab-level2 { padding: 0px 5px; } 
     951.new-activity-win fieldset fieldset, .new-activity-win fieldset.tab-level2 fieldset { padding: 5px 0; } 
    866952 
    867953.hidden { 
     
    904990} 
    905991 
     992.new-event-win form.form-addevent { padding: 9px; } 
     993 
     994.new-activity-win div.div-addtask { padding: 0; width: 774px; border: 0;} 
     995.new-activity-win div.div-addactivity { padding: 0; width: 734px; border: 0;} 
     996.new-activity-win form.form-addevent { padding: 9px; } 
    906997.ui-dialog .ui-dialog-content { padding: 0; } 
    907 .new-event-win div.div-addevent { padding: 0; width: 700px; border: 0;} 
    908 .new-event-win form.form-addevent { padding: 9px; } 
     998.new-event-win div.div-addevent{ padding: 0; width: 700px; border: 0;} 
     999.new-task-win div.div-addtask { padding: 0; width: 774px; border: 0;} 
     1000.new-event-win form.form-addevent, .new-task-win form.form-addtask { padding: 9px; } 
     1001.new-activity-win div.div-addevent { padding: 0; width: 700px; border: 0;} 
     1002.new-activity-win form.form-addevent { padding: 9px; } 
    9091003 
    9101004.expresso-calendar-container input[type="text"] { height: 18px; } 
     
    9291023 
    9301024.expresso-calendar-container input.h1, 
    931 .new-event-win input.h1 { 
     1025.new-event-win input.h1, .new-task-win input.h1, .new-activity-win input.h1 { 
    9321026        font-size: 150%; 
    9331027        font-weight: bold; 
     
    9361030} 
    9371031 
    938 .new-event-win textarea { 
     1032.new-event-win textarea, .new-task-win textarea, .new-activity-win textarea { 
    9391033        width:600px; 
    9401034        height: 210px; 
     
    9451039span.input-group { display: block; } 
    9461040/*p.input-group label { vertical-align: top; }*/ 
    947 .new-event-win p.input-group label { display: inline-block; width: 65px;} 
    948 .new-event-win p.input-group label.input-group { display: inline-block; width: 110px; font-weight: bold;} 
     1041.new-event-win p.input-group label, .new-task-win p.input-group label { display: inline-block; width: 65px;} 
     1042.new-event-win p.input-group label.input-group, .new-task-win p.input-group label.input-group { display: inline-block; width: 110px; font-weight: bold;} 
     1043.new-activity-win p.input-group label { display: inline-block; width: 65px;} 
     1044.new-activity-win p.input-group label.input-group { display: inline-block; width: 110px; font-weight: bold;} 
    9491045 
    9501046input.number {text-align: right} 
     
    9661062.new-event-win fieldset.event-repeat-container label,  
    9671063.new-event-win p.input-group.event-repeat-weekly label,  
    968 .new-event-win p.input-group.event-repeat-monthly label { 
     1064.new-event-win p.input-group.event-repeat-monthly label, 
     1065.new-task-win fieldset.task-repeat-container label,  
     1066.new-task-win p.input-group.task-repeat-weekly label,  
     1067.new-task-win p.input-group.task-repeat-monthly label 
     1068{ 
    9691069        width: auto;  
    9701070} 
     
    9731073.new-event-win fieldset.search-field, 
    9741074.new-event-win fieldset.block-add-attendee-permissions, 
    975 .new-event-win fieldset.block-attendee-list { 
     1075.new-event-win fieldset.block-attendee-list, 
     1076.new-task-win fieldset.input-field-rounded, 
     1077.new-task-win fieldset.search-field, 
     1078.new-task-win fieldset.block-add-attendee-permissions, 
     1079.new-task-win fieldset.block-attendee-list 
     1080{ 
    9761081        border:1px solid #CFCFCF; 
    9771082} 
    9781083 
    979 .new-event-win fieldset.block-attendee-list { width: 300px; max-height:180px; padding: 5px; float: left;} 
    980 .new-event-win fieldset.block-attendee-list ul {  height:160px; overflow: auto;} 
     1084.new-event-win fieldset.block-attendee-list, .new-task-win fieldset.block-attendee-list { width: 300px; max-height:180px; padding: 5px; float: left;} 
     1085.new-event-win fieldset.block-attendee-list ul, .new-task-win fieldset.block-attendee-list ul {  height:160px; overflow: auto;} 
     1086/**/ 
     1087.new-activity-win fieldset.event-repeat-container label,  
     1088.new-activity-win p.input-group.event-repeat-weekly label,  
     1089.new-activity-win p.input-group.event-repeat-monthly label { 
     1090        width: auto;  
     1091} 
     1092 
     1093.new-activity-win fieldset.input-field-rounded, 
     1094.new-activity-win fieldset.search-field, 
     1095.new-activity-win fieldset.block-add-attendee-permissions, 
     1096.new-activity-win fieldset.block-attendee-list { 
     1097        border:1px solid #CFCFCF; 
     1098} 
     1099 
     1100.new-activity-win fieldset.block-attendee-list { width: 300px; max-height:180px; padding: 5px; float: left;} 
     1101.new-activity-win fieldset.block-attendee-list ul {  height:160px; overflow: auto;} 
    9811102 
    9821103 
     
    11481269} 
    11491270 
    1150 .events-list-win table img { 
    1151   width: 12px; 
    1152   height: 12px; 
    1153   padding: 0 2px; 
    1154 } 
    11551271 
    11561272.events-list-win table span { font-size:12px; } 
  • trunk/prototype/modules/calendar/css/style.css

    r6921 r6996  
    4545.ui-dialog .ui-button-text-only .ui-button-text { padding: 0.4em 1em; } 
    4646 
    47 .new-event-win fieldset { border: none; margin: 0; padding: 0; } 
    48 .new-event-win fieldset.tab-level2 { padding: 0px 5px; min-height: 310px; max-height: 310px; overflow: auto;} 
    49 .new-event-win .overflow_add_calender { overflow: auto; max-height: 320px; } 
    50 .new-event-win fieldset#calendar_addevent_details7 { overflow: hidden} 
    51 .new-event-win fieldset#calendar_addevent_details5 .button-files-upload{margin: 15px 0 0 0} 
    52 .new-event-win fieldset fieldset, .new-event-win fieldset.tab-level2 fieldset { padding: 5px 0; } 
     47.new-event-win fieldset, .new-task-win fieldset  { border: none;        margin: 0; padding: 0; } 
     48.new-event-win fieldset.tab-level2, .new-task-win fieldset.tab-level2 { padding: 0px 5px; min-height: 110px; max-height: 310px; overflow: hidden;} 
     49.new-event-win .overflow_add_calender, .new-task-win .overflow_add_calender { overflow: auto; max-height: 320px; } 
     50.new-event-win fieldset#calendar_addevent_details7, .new-task-win fieldset#calendar_addevent_details7 { overflow: hidden} 
     51.new-event-win fieldset#calendar_addevent_details5 .button-files-upload, .new-task-win fieldset#calendar_addevent_details5 .button-files-upload{margin: 15px 0 0 0} 
     52.new-event-win fieldset fieldset, .new-event-win fieldset.tab-level2 fieldset, .new-task-win fieldset fieldset, .new-event-win fieldset.tab-level2 fieldset { padding: 5px 0; } 
     53 
     54.new-activity-win fieldset { border: none; margin: 0; padding: 0; } 
     55.new-activity-win fieldset.tab-level2 { padding: 0px 5px; min-height: 250px; max-height: 310px; overflow: auto;} 
     56 
     57.new-activity-win .overflow_add_calender { overflow: auto; max-height: 320px; } 
     58.new-activity-win fieldset#calendar_addevent_details7 { overflow: hidden} 
     59.new-activity-win fieldset#calendar_addevent_details5 .button-files-upload{margin: 15px 0 0 0} 
     60.new-activity-win fieldset fieldset, .new-activity-win fieldset.tab-level2 fieldset { padding: 5px 0; } 
    5361 
    5462.hidden { 
     
    92100 
    93101.ui-dialog .ui-dialog-content { padding: 0; } 
    94 .new-event-win div.div-addevent { padding: 0; width: 700px; border: 0;} 
    95 .new-event-win form.form-addevent { padding: 9px; } 
     102.new-event-win div.div-addevent{ padding: 0; width: 700px; border: 0;} 
     103.new-task-win div.div-addtask { padding: 0; width: 774px; border: 0;} 
     104 
     105.new-event-win form.form-addevent,  
     106.new-task-win form.form-addtask, 
     107.new-activity-win form.form-addactivity { padding: 9px; } 
     108 
     109.new-activity-win input.time{width: 45px;} 
     110.new-activity-win input.date{width: 80px;} 
     111 
     112.new-activity-win div.div-addactivity { padding: 0; width: 734px; border: 0;} 
     113.new-activity-win form.form-addactivity { padding: 9px; } 
    96114 
    97115.expresso-calendar-container input[type="text"] { height: 18px; } 
     
    116134 
    117135.expresso-calendar-container input.h1, 
    118 .new-event-win input.h1 { 
     136.new-event-win input.h1, 
     137.new-task-win input.h1{ 
    119138        font-size: 150%; 
    120139        font-weight: bold; 
     
    122141        height: 150%; 
    123142} 
    124  
    125 .new-event-win textarea { 
     143.new-activity-win input.h1 { 
     144  font-size: 150%; 
     145  font-weight: bold; 
     146  width: 100%; 
     147  height: 150%; 
     148} 
     149 
     150.expresso-calendar-container input.h1, 
     151.new-task-win input.h1 { 
     152        font-size: 150%; 
     153        font-weight: bold; 
     154        width: 64%; 
     155        height: 150%; 
     156} 
     157 
     158.new-event-win textarea, .new-task-win textarea { 
    126159        width:600px; 
    127160        height: 210px; 
     
    130163} 
    131164 
     165.new-activity-win textarea { 
     166  width:600px; 
     167  height: 210px; 
     168  border: 1px solid #CFCFCF; 
     169  padding: 0px; 
     170} 
    132171span.input-group { display: block; } 
    133172/*p.input-group label { vertical-align: top; }*/ 
    134 .new-event-win p.input-group label { display: inline-block; width: 65px;} 
    135 .new-event-win p.input-group label.input-group { display: inline-block; width: 110px; font-weight: bold;} 
     173.new-event-win p.input-group label, .new-task-win p.input-group label { display: inline-block; width: 65px;} 
     174.new-event-win p.input-group label.input-group, .new-task-win p.input-group label.input-group { display: inline-block; width: 110px; font-weight: bold;} 
     175.new-activity-win p.input-group label { display: inline-block; width: 65px;} 
     176.new-activity-win p.input-group label.input-group { display: inline-block; width: 110px; font-weight: bold;} 
    136177 
    137178input.number {text-align: right} 
     
    153194.new-event-win fieldset.event-repeat-container label,  
    154195.new-event-win p.input-group.event-repeat-weekly label,  
    155 .new-event-win p.input-group.event-repeat-monthly label { 
     196.new-event-win p.input-group.event-repeat-monthly label, 
     197.new-task-win fieldset.task-repeat-container label,  
     198.new-task-win p.input-group.task-repeat-weekly label,  
     199.new-task-win p.input-group.task-repeat-monthly label 
     200{ 
    156201        width: auto;  
     202} 
     203 
     204.new-activity-win fieldset.event-repeat-container label,  
     205.new-activity-win p.input-group.event-repeat-weekly label,  
     206.new-activity-win p.input-group.event-repeat-monthly label { 
     207  width: auto;  
    157208} 
    158209 
     
    160211.new-event-win fieldset.search-field, 
    161212.new-event-win fieldset.block-add-attendee-permissions, 
    162 .new-event-win fieldset.block-attendee-list { 
     213.new-event-win fieldset.block-attendee-list, 
     214.new-task-win fieldset.input-field-rounded, 
     215.new-task-win fieldset.search-field, 
     216.new-task-win fieldset.block-add-attendee-permissions, 
     217.new-task-win fieldset.block-attendee-list{ 
    163218        border:1px solid #CFCFCF; 
    164219} 
    165220 
     221.new-event-win fieldset.block-attendee-list, .new-task-win fieldset.block-attendee-list { width: 300px; max-height:180px; padding: 5px; float: left;} 
     222.new-event-win fieldset.block-attendee-list ul, .new-task-win fieldset.block-attendee-list ul {  height:160px; overflow: auto;} 
     223 
     224.new-activity-win fieldset.input-field-rounded, 
     225.new-activity-win fieldset.search-field, 
     226.new-activity-win fieldset.block-add-attendee-permissions, 
     227.new-activity-win fieldset.block-attendee-list { 
     228  border:1px solid #CFCFCF; 
     229} 
     230/*Duvida*/ 
    166231.new-event-win fieldset.block-attendee-list { width: 300px; max-height:180px; padding: 5px; float: left;} 
    167232.new-event-win fieldset.block-attendee-list ul {  height:160px; overflow: auto;} 
     233 
     234.new-activity-win fieldset.block-attendee-list { width: 300px; max-height:180px; padding: 5px; float: left;} 
     235.new-activity-win fieldset.block-attendee-list ul {  height:160px; overflow: auto;} 
    168236 
    169237 
     
    223291.block-vertical-toolbox .button.add { 
    224292    width:190px; 
    225 } 
     293    margin-bottom: 5px; 
     294} 
     295 
     296div.qtip div.add-simple-task input{width: 188px} 
     297div.qtip div.add-simple-task textarea{width: 184px} 
     298 
    226299 
    227300.fc-header .fc-state-active, .fc-header .ui-state-active { 
     
    335408} 
    336409 
    337 .events-list-win table img { 
    338   width: 12px; 
    339   height: 12px; 
    340   padding: 0 2px; 
    341 } 
    342  
    343410.events-list-win table span { font-size:12px; } 
    344411.events-list-win table .same-start-date * { border: 0; } 
     
    348415.events-list-win table th.start-date-multiple-events { border-bottom: 1px solid #ccc; } 
    349416 
     417.events-list-win .fc-header-right.list-right{width: 26%} 
     418 
    350419.events-list-win table .title { 
    351420    font-size: 150%; 
     
    361430.expresso-calendar-container .search-field input { border:none;} 
    362431 
    363 .ui-tabs .ui-tabs-panel { padding: 0; margin-top: 10px;} 
     432.ui-tabs .ui-tabs-panel { padding: 0; margin-top: 11px;} 
    364433 
    365434.ui-tabs .ui-tabs-nav li .ui-icon-close { 
     
    459528 
    460529input.inputNumber {width:80px; text-align: left;} 
     530 
     531.div-addtask #calendar_addtask_details1 .h1{ 
     532  width: 100%; 
     533} 
     534 
     535.div-addtask #calendar_addtask_details2 textarea { 
     536  width: 670px; 
     537} 
     538 
     539.div-addtask{ 
     540  width: 760px; 
     541} 
     542 
     543.calendar-addevent-details-txt-timezone, .calendar-addtask-details-txt-timezone{width: 217px;}  
     544 
     545.div-addtask #calendar_addtask_details1 .time-previsao { width: 40px; } 
     546 
     547.div-addtask #calendar_addtask_details1 .date-previsao{ width: 80px; } 
     548 
     549.div-addtask #calendar_addtask_details1 .start-time{ width: 40px; } 
     550.div-addtask #calendar_addtask_details1 .start-date{ width: 80px; } 
     551.div-addtask #calendar_addtask_details1 .end-time{ width: 40px; } 
     552.div-addtask #calendar_addtask_details1 .end-date{ width: 80px; } 
     553.div-addtask #calendar_addtask_details1 .previsao-termino { margin: 0 0 0 30px; } 
     554.div-addtask #calendar_addtask_details1 .subitem { margin: 5px; display: block;} 
     555.div-addtask #calendar_addtask_details1 .subitem .span_done{ margin: 0 30px;} 
     556.div-addtask #calendar_addtask_details1 .subitem .span_done img{position: relative; top:4px; width:16px; height:16px;} 
     557.div-addtask #calendar_addtask_details1 .calendar_addevent_details_lnk_timezone { margin: 0 0 0 20px;} 
     558.div-addtask #calendar_addtask_details1 .subitem .done { width: 45px;} 
     559 
     560@-moz-document url-prefix() {.div-addtask #calendar_addtask_details1 .ui-spinner-buttons{ top: -14px !important;}} 
     561 
     562@media screen and (-webkit-min-device-pixel-ratio:0){.div-addtask #calendar_addtask_details1 .ui-spinner-buttons{ top: -2px !important;}} 
     563 
     564.div-addtask #calendar_addtask_details1 .ui-spinner-buttons .ui-spinner-up{height: 7px !important;} 
     565.div-addtask #calendar_addtask_details1 .ui-spinner-buttons .ui-spinner-down{height: 8px !important;} 
     566 
     567.div-addtask #calendar_addtask_details1 .subitem .span_done.noAction{background-image: url("../img/gray.png"); background-repeat: no-repeat; } 
     568.div-addtask #calendar_addtask_details1 .subitem .span_done.inProcess{background-image: url("../img/yellow.png"); background-repeat: no-repeat;} 
     569.div-addtask #calendar_addtask_details1 .subitem .span_done.finished{background-image: url("../img/green.png"); background-repeat: no-repeat;} 
     570.div-addtask #calendar_addtask_details1 .subitem .span_done.canceled{background-image: url("../img/red.png"); background-repeat: no-repeat;} 
     571.div-addtask #calendar_addtask_details1 .subitem .span_done label{position: relative; left: 28px;} 
     572 
     573.div-addtask fieldset#calendar_addtask_details5.tab-level2{margin: 0} 
     574 
     575.div-addtask  #calendar_addtask_details8 .parent {width: 746px; min-height: 208px; float: left;} 
     576/*.div-addtask  #calendar_addtask_details8 .parent .child-top {width: 745px; height: 20px; background: #E8F4FD; border-left: 1px solid #CCC; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC;}*/ 
     577.div-addtask  #calendar_addtask_details8 .parent .child-top {width: 745px; height: 25px; background: #E8F4FD; border-left: 1px solid #CCC; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC; border-top: 1px solid #CCC;} 
     578.div-addtask  #calendar_addtask_details8 .parent .child-bottom {width: 745px; height: 208px; overflow: auto;  float: left; border-left: 1px solid #CCC; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC;} 
     579.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each { height: 20px; } 
     580.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each:hover { background: #FFF2F2; cursor: pointer;} 
     581 
     582.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .date-hour {overflow: hidden; width: 140px; float: left; height: 20px} 
     583.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .date-hour span { margin: 8px; float: left; } 
     584.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .user{overflow: hidden; width: 150px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     585.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .user span{ margin: 8px; float: left; } 
     586.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .attribute{overflow: hidden; width: 130px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     587.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .attribute span{ margin: 8px; float: left; } 
     588.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .beforeValue{overflow: hidden; width: 150px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     589.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .beforeValue span{ margin: 8px; float: left; } 
     590.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .afterValue{overflow: hidden; width: 150px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     591.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .afterValue span{ margin: 8px; float: left; } 
     592 
     593.div-addtask  #calendar_addtask_details8 .parent .child-top .date-hour { width: 140px; float: left; background: #E8F4FD; height: 20px; text-align: center; } 
     594.div-addtask  #calendar_addtask_details8 .parent .child-top .date-hour span{ display: block; padding: 6px; font-weight: bold; color: #2E6E9E; } 
     595.div-addtask  #calendar_addtask_details8 .parent .child-top .user { width: 150px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E; text-align: center;} 
     596.div-addtask  #calendar_addtask_details8 .parent .child-top .user span{display: block; padding: 6px;} 
     597.div-addtask  #calendar_addtask_details8 .parent .child-top .attribute { width: 130px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
     598.div-addtask  #calendar_addtask_details8 .parent .child-top .attribute span{display: block; padding: 6px;} 
     599.div-addtask  #calendar_addtask_details8 .parent .child-top .beforeValue { width: 150px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
     600.div-addtask  #calendar_addtask_details8 .parent .child-top .beforeValue span{display: block; padding: 6px; } 
     601.div-addtask  #calendar_addtask_details8 .parent .child-top .afterValue { width: 150px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
     602.div-addtask  #calendar_addtask_details8 .parent .child-top .afterValue span{display: block; padding: 6px; } 
     603 
     604/*Atividades*/ 
     605 
     606.div-addactivity{ width: 734px;} 
     607.div-addactivity #group_addactivity_details1 .h1{ width: 100%;} 
     608.div-addactivity #group_addactivity_details2 textarea { width: 635px; } 
     609.div-addactivity #group_addactivity_details1 .time-due { width: 40px; } 
     610.div-addactivity #group_addactivity_details1 .date-due{ width: 80px; } 
     611 
     612.div-addactivity #group_addactivity_details1 .start-time{ width: 40px; } 
     613.div-addactivity #group_addactivity_details1 .start-date{ width: 80px; } 
     614.div-addactivity #group_addactivity_details1 .end-time{ width: 40px; } 
     615.div-addactivity #group_addactivity_details1 .end-date{ width: 80px; } 
     616.div-addactivity #group_addactivity_details1 .previsao-termino { margin: 0 0 0 30px; } 
     617.div-addactivity #group_addactivity_details1 .subitem { margin: 5px; display: block;} 
     618.div-addactivity #group_addactivity_details1 .subitem .span_done{ margin: 0 30px;} 
     619.div-addactivity #group_addactivity_details1 .calendar_addevent_details_lnk_timezone { margin: 0 0 0 20px;} 
     620.div-addactivity #group_addactivity_details1 .subitem .done { width: 45px;}  
     621 
     622.div-addactivity #group_addactivity_details1 .subitem .span_done.noAction{background-image: url("../img/gray.png"); background-repeat: no-repeat; } 
     623.div-addactivity #group_addactivity_details1 .subitem .span_done.inProcess{background-image: url("../img/yellow.png"); background-repeat: no-repeat;} 
     624.div-addactivity #group_addactivity_details1 .subitem .span_done.finished{background-image: url("../img/green.png"); background-repeat: no-repeat;} 
     625.div-addactivity #group_addactivity_details1 .subitem .span_done.canceled{background-image: url("../img/red.png"); background-repeat: no-repeat;} 
     626.div-addactivity #group_addactivity_details1 .subitem .span_done label{position: relative; left: 28px;} 
     627 
     628.div-addactivity #group_addactivity_details5.tab-level2{margin-top: 2px;} 
     629.div-addactivity #group_addactivity_details5 .button-files-upload { margin: 0 0 0 5px; } 
     630 
     631/**********************************************************************************************************/ 
     632.div-addactivity  #group_addactivity_details6  .parent {width: 695px; min-height: 208px; float: left;} 
     633/*.div-addactivity  #group_addactivity_details6  .parent .child-top {width: 745px; height: 20px; background: #E8F4FD; border-left: 1px solid #CCC; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC;}*/ 
     634.div-addactivity  #group_addactivity_details6  .parent .child-top {width: 695px; height: 25px; background: #E8F4FD; border-left: 1px solid #CCC; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC; border-top: 1px solid #CCC;} 
     635.div-addactivity  #group_addactivity_details6  .parent .child-bottom {width: 695px; height: 208px; overflow: auto;  float: left; border-left: 1px solid #CCC; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC;} 
     636.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each { height: 20px; } 
     637.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each:hover { background: #FFF2F2; cursor: pointer;} 
     638 
     639.div-addactivity  #group_addactivity_details6  .parent .child-bottom .task { height: 25px; text-align: center; background: #FEFEAD; border-bottom: 1px solid #CCC;} 
     640.div-addactivity  #group_addactivity_details6  .parent .child-bottom .task.left {border-top: 1px solid #CCC;} 
     641.div-addactivity  #group_addactivity_details6  .parent .child-bottom .task span{padding: 5px; display: block;} 
     642 
     643.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .date-hour {overflow: hidden; width: 140px; float: left; height: 20px} 
     644.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .date-hour span { margin: 8px; float: left; } 
     645.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .user{overflow: hidden; width: 145px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     646.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .user span{ margin: 8px; float: left; } 
     647.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .attribute{overflow: hidden; width: 130px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     648.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .attribute span{ margin: 8px; float: left; } 
     649.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .beforeValue{overflow: hidden; width: 130px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     650.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .beforeValue span{ margin: 8px; float: left; } 
     651.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .afterValue{overflow: hidden; width: 129px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     652.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .afterValue span{ margin: 8px; float: left; } 
     653 
     654.div-addactivity  #group_addactivity_details6  .parent .child-top .date-hour { width: 140px; float: left; background: #E8F4FD; height: 20px; text-align: center; } 
     655.div-addactivity  #group_addactivity_details6  .parent .child-top .date-hour span{ display: block; padding: 6px; font-weight: bold; color: #2E6E9E; } 
     656.div-addactivity  #group_addactivity_details6  .parent .child-top .user { width: 145px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E; text-align: center;} 
     657.div-addactivity  #group_addactivity_details6  .parent .child-top .user span{display: block; padding: 6px; } 
     658.div-addactivity  #group_addactivity_details6  .parent .child-top .attribute { width: 130px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
     659.div-addactivity  #group_addactivity_details6  .parent .child-top .attribute span{display: block; padding: 6px; } 
     660.div-addactivity  #group_addactivity_details6  .parent .child-top .beforeValue { width: 130px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
     661.div-addactivity  #group_addactivity_details6  .parent .child-top .beforeValue span{display: block; padding: 6px; } 
     662.div-addactivity  #group_addactivity_details6  .parent .child-top .afterValue { width: 129px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
     663.div-addactivity  #group_addactivity_details6  .parent .child-top .afterValue span{display: block; padding: 6px; } 
  • trunk/prototype/modules/calendar/export.php

    r5863 r6996  
    4646{     
    4747    $event = Controller::read(array('concept' => 'schedulable' , 'id' => $params['event'])); 
    48         $attachmentRelation = Controller::find( array( 'concept' => 'schedulableToAttachment' ) , false ,array( 'filter' => array('=', 'schedulable'  ,  $event['id']) ));  
    49         if(is_array($attachmentRelation)){ 
    50                 $attachments = array(); 
    51                 foreach($attachmentRelation as $key => $value) 
    52                         if(isset($value['attachment']) || !!$value['attachment']) 
    53                                 $attachments[$key]  = $value['attachment']; 
    54                 //Pega os anexos sem source 
    55                 $event['attachments'] = Controller::find( array( 'concept' => 'attachment' ) , false ,array( 'filter' => array('IN', 'id' , $attachments) ));  
    56         } 
     48    $attachmentRelation = Controller::find( array( 'concept' => 'schedulableToAttachment' ) , false ,array( 'filter' => array('=', 'schedulable'  ,  $event['id']) ));  
     49    if(is_array($attachmentRelation)){ 
     50            $attachments = array(); 
     51            foreach($attachmentRelation as $key => $value) 
     52                    if(isset($value['attachment']) || !!$value['attachment']) 
     53                            $attachments[$key]  = $value['attachment']; 
     54            //Pega os anexos sem source 
     55            $event['attachments'] = Controller::find( array( 'concept' => 'attachment' ) , false ,array( 'filter' => array('IN', 'id' , $attachments) ));  
     56    } 
    5757         
    5858    $repeat = Controller::find( array( 'concept' => 'repeat' ) , false ,array( 'filter' => array('=', 'schedulable'  ,  $event['id']) ));     
  • trunk/prototype/modules/calendar/interceptors/DBMapping.php

    r6849 r6996  
    1010class DBMapping extends Helpers { 
    1111 
    12     static function encodeCreateSchedulable(&$uri, &$params, &$criteria, $original) { 
    13         $params['type_id'] = EVENT_ID; 
    14  
    15         if (!is_numeric($params['startTime'])) 
    16             $params['startTime'] = self::parseTimeDate($params['startTime'], $params['timezone']); 
    17  
    18         if (!is_numeric($params['endTime'])) { 
    19             $params['endTime'] = self::parseTimeDate($params['endTime'], $params['timezone']); 
    20  
    21             if ($params['allDay']) 
    22                 $params['endTime'] = $params['endTime'] + 86400000; 
    23         } 
    24  
    25         $params['rangeEnd'] = $params['endTime']; 
    26         $params['rangeStart'] = $params['startTime']; 
    27  
    28         /////////////////////////////////////////////////////////////////// 
    29  
    30         $params['dtstamp'] = (isset($params['dtstamp'])) ? $params['dtstamp'] : time() . '000'; 
    31         $params['lastUpdate'] = (isset($params['lastUpdate'])) ? $params['lastUpdate'] : time() . '000'; 
    32         $params['type'] = EVENT_ID; 
    33         $params['uid'] = isset($params['uid']) ? $params['uid'] : self::_makeUid(); 
    34     } 
     12    static function encodeCreateSchedulable(&$uri, &$params, &$criteria, $original)  
     13    { 
     14 
     15        if (isset($params['startTime']) && !is_numeric($params['startTime'])){ 
     16            $params['startTime'] = self::parseTimeDate($params['startTime'], $params['timezone']); 
     17            $params['rangeStart'] = $params['startTime']; 
     18        } 
     19        if (isset($params['endTime']) && !is_numeric($params['endTime'])) { 
     20            $params['endTime'] = self::parseTimeDate($params['endTime'], $params['timezone']); 
     21 
     22            if ($params['allDay']) 
     23                $params['endTime'] = $params['endTime'] + 86400000; 
     24             
     25            $params['rangeEnd'] = $params['endTime']; 
     26        } 
     27 
     28        if (isset($params['due']) && $params['due'] != '' && !is_numeric($params['due'])) 
     29            $params['due'] = self::parseTimeDate($params['due'], $params['timezone']); 
     30 
     31        /////////////////////////////////////////////////////////////////// 
     32 
     33        $params['dtstamp'] = (isset($params['dtstamp'])) ? $params['dtstamp'] : time() . '000'; 
     34        $params['lastUpdate'] = (isset($params['lastUpdate'])) ? $params['lastUpdate'] : time() . '000'; 
     35        $params['uid'] = isset($params['uid']) ? $params['uid'] : self::_makeUid(); 
     36        } 
    3537 
    3638    static function parseTimeDate($time, $timezone) { 
     
    6668        if (isset($params['type'])) 
    6769            $params['type'] = self::codeAlarmType($params['type']); 
     70        else{ 
     71            $alarm = Controller::read( array('concept' => 'alarm' , 'id' => $params['id'] )); 
     72 
     73            $params['unit'] = $alarm['unit']; 
     74        } 
     75        $params['offset'] = $params['time'] * 1000; 
     76 
     77 
     78        switch( strtolower($params['unit']) ) 
     79        { 
     80            case 'd': $params['offset'] *= 24; 
     81            case 'h': $params['offset'] *= 60; 
     82            case 'm': $params['offset'] *= 60; 
     83        } 
     84         
    6885    } 
    6986 
     
    119136                .'calendar_object.dtstart as "startTime", calendar_object.summary as "summary", ' 
    120137                .'calendar_object.description as "description", calendar_object.dtend as "endTime" , ' 
     138        .'calendar_object.priority as "priority", calendar_object.due as "due", ' 
     139        .'calendar_object.percentage as "percentage", calendar_object.status as "status", ' 
    121140                .'calendar_object.location as "location", calendar_object.allday as "allDay", ' 
    122141                .'calendar_object.transp as "transparent", calendar_object.class_id as "class", ' 
     
    127146                .'calendar FROM calendar_to_calendar_object , calendar_object ' 
    128147                .'WHERE ( calendar_to_calendar_object.calendar_id IN (\'' . implode('\',\'', $criteria['filter'][2][2]) . '\')) ' 
    129                 .'AND calendar_to_calendar_object.calendar_object_id = calendar_object.id ';     
     148                .'AND calendar_to_calendar_object.calendar_object_id = calendar_object.id ' 
     149        .'AND calendar_object.id NOT IN(select calendar_object_task_id from calendar_task_to_activity_object where owner = \'' . Config::me('uidNumber') . '\') ';       
    130150             
    131151            if(isset($criteria['searchEvent']) && $criteria['searchEvent']){ 
     
    157177                $params = array_merge($params, $occ);            
    158178            } 
     179            $params = self::deepnessFindEvent($uri, $params, $criteria, $original); 
     180            return false; 
     181        } 
     182    } 
     183 
     184    public function findTask(&$uri, &$params, &$criteria, $original) { 
     185 
     186        if (isset($criteria['filterTasks']) && $criteria['filterTasks']) { 
     187 
     188            $sql = ' SELECT calendar_object.id as id ,calendar_object.cal_uid as "uid", calendar_object.type_id as "type", ' 
     189            .'calendar_object.dtstart as "startTime", calendar_object.summary as "summary", ' 
     190            .'calendar_object.description as "description", calendar_object.dtend as "endTime" , ' 
     191            .'calendar_object.priority as "priority", calendar_object.due as "due", ' 
     192            .'calendar_object.percentage as "percentage", calendar_object.status as "status", ' 
     193            .'calendar_object.location as "location", calendar_object.allday as "allDay", ' 
     194            .'calendar_object.transp as "transparent", calendar_object.class_id as "class", ' 
     195            .'calendar_object.repeat as "repeat", calendar_object.range_start as "rangeStart", ' 
     196            .'calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", ' 
     197            .'calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence", ' 
     198            .'calendar_object.tzid as "timezone" ,calendar_to_calendar_object.calendar_id as ' 
     199            .'calendar FROM calendar_to_calendar_object , calendar_object ' 
     200            .'WHERE ( calendar_to_calendar_object.calendar_id IN (\'' . implode('\',\'', $criteria['filter'][3][2]) . '\')) ' 
     201            .'AND calendar_to_calendar_object.calendar_object_id = calendar_object.id ' 
     202        .'AND calendar_to_calendar_object.calendar_object_id NOT IN (select calendar_object_activity_id from calendar_task_to_activity_object where owner =  \'' . Config::me("uidNumber") . '\' ) '     
     203        .'AND calendar_to_calendar_object.calendar_object_id NOT IN (select calendar_object_task_id from calendar_task_to_activity_object where owner =  \'' . Config::me("uidNumber") . '\' ) ';     
     204 
     205        if(isset($criteria['filter'][4])) 
     206            $sql .= 'AND (((upper("summary") like upper(\'%'.$criteria['filter'][4][1][2].'%\') OR upper("description") like upper(\'%'.$criteria['filter'][4][1][2].'%\'))))'; 
     207 
     208            $sql .= 'AND (range_start >= \'' . $criteria['filter'][2][2] . '\' AND type_id <= \'' .  $criteria['filter'][1][2] . '\')'; 
     209 
     210            $params = Controller::service('PostgreSQL')->execResultSql($sql); 
    159211            $params = self::deepnessFindEvent($uri, $params, $criteria, $original); 
    160212            return false; 
     
    405457    public function encodeUpdateSchedulable(&$uri, &$params, &$criteria, $original) { 
    406458 
    407         $event = Controller::read(array('concept' => 'schedulable', 'id' => $params['id'])); 
    408          
    409         if (isset($params['startTime'])) { 
    410  
    411             if (!is_numeric($params['startTime'])) 
    412                 $params['startTime'] = self::parseTimeDate($params['startTime'], $event['timezone']); 
    413  
    414             $params['rangeStart'] = $params['startTime']; 
    415         }if (isset($params['endTime'])) { 
    416  
    417             if (!is_numeric($params['endTime'])) { 
    418                 $params['endTime'] = self::parseTimeDate($params['endTime'], $event['timezone']); 
    419  
    420             if ((isset($params['allDay']) && $params['allDay']) || ( !isset($params['allDay']) && $event['allDay'])) 
    421                 $params['endTime'] = $params['endTime'] + 86400000; 
    422             } 
    423             $params['rangeEnd'] = $params['endTime']; 
    424         } 
     459        $event = Controller::read(array('concept' => 'schedulable', 'id' => $params['id'])); 
     460                     
     461        if (isset($params['startTime'])) { 
     462 
     463            if (!is_numeric($params['startTime'])) 
     464                $params['startTime'] = self::parseTimeDate($params['startTime'], $event['timezone']); 
     465 
     466            $params['rangeStart'] = $params['startTime']; 
     467        } 
     468 
     469        if (isset($params['endTime'])) { 
     470 
     471            if (!is_numeric($params['endTime'])) { 
     472                        $params['endTime'] = self::parseTimeDate($params['endTime'], $event['timezone']); 
     473 
     474                    if ((isset($params['allDay']) && $params['allDay']) || ( !isset($params['allDay']) && $event['allDay'])) 
     475                        $params['endTime'] = $params['endTime'] + 86400000; 
     476            } 
     477            $params['rangeEnd'] = $params['endTime']; 
     478        } 
     479 
     480 
     481        if (isset($params['due']) && $params['due'] != '' && !is_numeric($params['due'])) 
     482            $params['due'] = self::parseTimeDate($params['due'], $event['timezone']); 
     483 
     484 
     485        if($event['type'] == '2'){ 
     486 
     487            $criteria['historic'] = $params; 
     488            $criteria['beforeValue'] = $event; 
     489 
     490            if(isset($params['startTime']) && $params['startTime'] == $event['startTime']) 
     491                unset($criteria['historic']['startTime']); 
     492 
     493            if(isset($params['endTime']) && $params['endTime'] == $event['endTime']) 
     494                unset($criteria['historic']['endTime']); 
     495 
     496            if(isset($params['due']) && $params['due'] == $event['due']) 
     497                unset($criteria['historic']['due']); 
     498 
     499            //necessário para atulizar a atividade de composta pela tarefa aqui sendo atualizada 
     500            if(isset($criteria['historic']['startTime']) || isset($criteria['historic']['endTime'])){ 
     501                $taskToActivity = Controller::find(array('concept' => 'taskToActivity'), false, array('filter' => array('AND', array('=', 'schedulable', $event['id']), array('=', 'owner', Config::me('uidNumber'))), 'deepness' => 2)); 
     502 
     503                if(!empty($taskToActivity)){ 
     504                    $activity = Controller::read(array('concept' => 'schedulable', 'id' => $taskToActivity[0]['activity']), array('startTime', 'endTime', 'rangeStart', 'rangeEnd')); 
     505                    $start = $params['startTime']; 
     506                    $end = $params['endTime']; 
     507                    foreach($taskToActivity as $t){ 
     508                         if($t['task']['id'] != $params['id']){ 
     509                            $start = $t['task']['startTime'] < $start ? $t['task']['startTime'] : $start; 
     510                            $end = $t['task']['endTime'] < $end ? $t['task']['endTime'] : $end; 
     511                         } 
     512                    } 
     513 
     514                    $toUpdate = array(); 
     515                     
     516                    if($start != $activity['startTime']) 
     517                        $toUpdate['starTime'] = $start; 
     518                     
     519                    if($end != $activity['endTime']) 
     520                        $toUpdate['endTime'] = $end; 
     521                      
     522                    if(!empty($toUpdate)) 
     523                        Controller::update(array('concept' => 'schedulable', 'id' => $activity['id']), $toUpdate);                 
     524                } 
     525            } 
     526 
     527            unset($criteria['historic']['rangeEnd']); 
     528            unset($criteria['historic']['rangeStart']); 
     529            unset($criteria['historic']['class']); 
     530            unset($criteria['historic']['type']); 
     531            unset($criteria['historic']['allDay']); 
     532            unset($criteria['historic']['id']);             
     533        } 
    425534    } 
    426535 
     
    453562    } 
    454563 
     564 
     565    static function prepareParticipantHistoric(&$uri, &$params, &$criteria, $original){ 
     566       $participant = Controller::read(array('concept' => 'participant', 'id' => $uri['id'])); 
     567       $schedulable = Controller::read(array('concept' => 'schedulable', 'id' => $participant['schedulable'])); 
     568 
     569 
     570       if($schedulable['type'] == '2') 
     571            $criteria['historic']['participant']  = $participant; 
     572    }  
     573 
     574    static function removeParticipantHistoric(&$uri, &$params, &$criteria, $original){ 
     575        if(isset($criteria['historic'])){ 
     576 
     577            $participant = $criteria['historic']['participant']; 
     578 
     579             Controller::create(array('concept' => 'calendarHistoric'),  
     580                array('schedulable' => $participant['schedulable'],  
     581                    'user' => Config::me('uidNumber'), 
     582                    'time' => time() . '000', 
     583                    'attribute' => 'participant', 
     584                    'beforeValue' => $participant['user'], 
     585                    'afterValue' => '' 
     586                    ) 
     587                ); 
     588 
     589        } 
     590 
     591    } 
     592 
     593    static function createParticipantHistoric(&$uri, &$params, &$criteria, $original){ 
     594 
     595        if(isset($original['properties']) && $original['properties']['isOrganizer'] != '1'){ 
     596            if(!isset($criteria['event'])){ 
     597                $event = Controller::read(array('concept' => 'schedulable', 'id' => $original['properties']['schedulable'])); 
     598                $criteria['event'] = $event; 
     599            }else 
     600                $event = $criteria['event']; 
     601 
     602            if($event['type'] == '2'){ 
     603                Controller::create(array('concept' => 'calendarHistoric'),  
     604                    array('schedulable' => $original['properties']['schedulable'],  
     605                        'user' => Config::me('uidNumber'), 
     606                        'time' => time() . '000', 
     607                        'attribute' => 'participant', 
     608                        'beforeValue' => '', 
     609                        'afterValue' => $original['properties']['user'] 
     610                        ) 
     611                    ); 
     612            } 
     613        } 
     614    } 
     615 
     616    static function createHistoric(&$uri, &$result, &$criteria, $original) { 
     617 
     618        if(isset($criteria['historic']) && count($criteria['historic'])){ 
     619            $time =  time() . '000'; 
     620 
     621            foreach($criteria['historic'] as $k => $v){ 
     622                Controller::create(array('concept' => 'calendarHistoric'),  
     623                    array('schedulable' => $uri['id'],  
     624                        'user' => Config::me('uidNumber'), 
     625                        'time' => $time, 
     626                        'attribute' => $k, 
     627                        'beforeValue' => $criteria['beforeValue'][$k], 
     628                        'afterValue' => $v 
     629                        ) 
     630                    ); 
     631            } 
     632        }     
     633    } 
     634 
    455635/////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    456636 
     
    466646    } 
    467647 
    468     public function createCreateSchedulableToAttachment(&$uri, &$params, &$criteria, $original) { 
    469         if (array_key_exists('attachments', $original['properties'])) 
    470             foreach ($original['properties']['attachments'] as $key => $value) { 
    471                 if (isset($params['id'])) 
    472                     Controller::create(array('concept' => 'schedulableToAttachment'), array('attachment' => $value['attachment'], 'schedulable' => $params['id'])); 
    473             } 
     648    //TODO: Remover apos suporte a ManytoMany na api  
     649    public function createTasksToActivity(&$uri, &$result, &$criteria, $original) { 
     650 
     651        if(isset($original['properties']['taskToActivity']) && $original['properties']['taskToActivity']){ 
     652 
     653            foreach($original['properties']['taskToActivity'] as $relational) 
     654 
     655                Controller::create(array('concept' => 'taskToActivity'), array('task' => $relational['task'], 'owner' => $relational['owner'], 'activity' => $result['id'])); 
     656 
     657        } 
     658    } 
     659 
     660    public function removeAttachmentHistoric(&$uri, &$params, &$criteria, $original) { 
     661 
     662        if(isset($criteria['historic'])){ 
     663            $attachment = $criteria['historic']['attachment']; 
     664 
     665            $attachment['attachment'] = Controller::read(array('concept' => 'attachment', 'id' => $attachment['attachment']), array('name')); 
     666            Controller::create(array('concept' => 'calendarHistoric'),  
     667                    array('schedulable' => $attachment['schedulable'],  
     668                        'user' => Config::me('uidNumber'), 
     669                        'time' => time() . '000', 
     670                        'attribute' => 'attachment', 
     671                        'beforeValue' => $attachment['attachment']['name'], 
     672                        'afterValue' => '' 
     673                        ) 
     674                    ); 
     675 
     676        } 
     677     
     678    } 
     679 
     680    public function createAttachmentHistoric(&$uri, &$params, &$criteria, $original) { 
     681        $event = Controller::read(array('concept' => 'schedulable', 'id' => $original['properties']['schedulable'])); 
     682 
     683        if($event['type'] == '2'){ 
     684            $attachment = Controller::read(array('concept' => 'attachment', 'id' => $original['properties']['attachment']), array('name')); 
     685 
     686            Controller::create(array('concept' => 'calendarHistoric'),  
     687                array('schedulable' => $original['properties']['schedulable'],  
     688                    'user' => Config::me('uidNumber'), 
     689                    'time' => time() . '000', 
     690                    'attribute' => 'attachment', 
     691                    'beforeValue' => '', 
     692                    'afterValue' => $attachment['name'] 
     693                    ) 
     694                ); 
     695 
     696        } 
    474697    } 
    475698 
     
    512735 
    513736    //TODO: Remover apos suporte a deepness na api  
     737    public function deepnessFindTask(&$uri, &$result, &$criteria, $original) { 
     738        if (isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0)  
     739           foreach($result as &$value) 
     740                $value['task'] = Controller::read(array('concept' => 'schedulable', 'id' => $value['task'])); 
     741            
     742         
     743        return $result; 
     744    } 
     745 
     746    //TODO: Remover apos suporte a deepness na api  
     747    public function deepnessFindHistoric(&$uri, &$result, &$criteria, $original) { 
     748        if (isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) { 
     749            foreach($result as &$v){ 
     750                $v['user'] = Controller::read(array('concept' => 'user', 'id' => $v['user'])); 
     751 
     752                if($v['attribute'] == 'participant'){ 
     753                    if($v['beforeValue'] != '') 
     754                        $v['beforeValue'] = Controller::read(array('concept' => 'user', 'id' => $v['beforeValue'])); 
     755 
     756                    if($v['afterValue'] != '') 
     757                        $v['afterValue'] = Controller::read(array('concept' => 'user', 'id' => $v['afterValue'])); 
     758                } 
     759            } 
     760        } 
     761    } 
     762 
     763    //TODO: Remover apos suporte a deepness na api  
    514764    public function deepnessFindEvent(&$uri, &$result, &$criteria, $original) { 
    515765        if (isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) { 
     
    543793 
    544794                $result[$i]['DayLigth'] = $DayLigth; 
     795 
     796        if(((int)$v['type']) == 2){ 
     797 
     798            $taskToActivity = Controller::find(array('concept' => 'taskToActivity'), false, array('filter' => array('AND', array('=', 'activity', $v['id']), array('=','owner', Config::me('uidNumber'))) , 'deepness' => 2)); 
     799 
     800            if($taskToActivity) 
     801                $result[$i]['taskToActivity'] = $taskToActivity; 
     802 
     803            $result[$i]['historic'] = Controller::find(array('concept' => 'calendarHistoric'), false, array('filter' => array('=', 'schedulable', $v['id']) , 'deepness' => 2)); 
     804 
     805        } 
    545806 
    546807                if (isset($v['id'])) { 
     
    608869            }  
    609870             
     871       } 
     872        
     873       if(isset($result['id']) && $result['type'] == '2'){ 
     874           $result['historic'] =  Controller::find( array( 'concept' => 'calendarHistoric' ), false, array( 'filter' => array( '=', 'schedulable', $result['id'] ) ) ); 
    610875       } 
    611876   }  
     
    7911056     
    7921057    static private function countMyCalendarsEvent($id, $owner) { 
    793                 $sig = Controller::find(array('concept' => 'calendarSignature'), array('user', 'calendar', 'isOwner'), array('filter' => array('AND', array('=', 'user', $owner), array('=', 'isOwner', '1')))); 
     1058                $sig = Controller::find(array('concept' => 'calendarSignature'), array('user', 'calendar', 'isOwner'), array('filter' => array('AND', array('=', 'isOwner', '1'), array('=', 'user', $owner)))); 
    7941059                $calendars = array(); 
    7951060                foreach ($sig as $val) 
     
    8071072        if(isset($criteria['filter']) && $criteria['filter'] && isset($criteria['filter'][1][2])){ 
    8081073            $idSchedulable = $criteria['filter'][1][2]; 
    809                         $idCalendar = $criteria['filter'][2][2]; 
     1074            $idCalendar = $criteria['filter'][2][2]; 
    8101075            $owner = $criteria['filter'][3][2]; 
    8111076 
     
    8441109 
    8451110            $uri['id'] = $idSchedulable; 
     1111             
     1112            if(isset($criteria['filter']) && isset($criteria['filter'][4]) && isset($criteria['filter'][4][2])){ 
     1113                Controller::deleteALL(array('concept' => 'taskToActivity'), null, array('filter' => array('=', 'activity', $idSchedulable))); 
     1114            } 
    8461115        } 
    8471116         
     
    8941163            $schedulableAttachment = Controller::read(array('concept' => 'schedulableToAttachment'), false, array('filter' => array( '=', 'attachment' , $original['URI']['id'] ))); 
    8951164            $uri['id'] = $schedulableAttachment[0]['id']; 
     1165 
     1166            $params = $schedulableAttachment[0]; 
     1167 
     1168            $event = Controller::read(array('concept' => 'schedulable', 'id' => $params['schedulable'])); 
     1169            if($event['type'] == '2') 
     1170                $criteria['historic']['attachment'] = $schedulableAttachment[0]; 
     1171 
    8961172        } 
    8971173    } 
    8981174 
    8991175    public function deleteAttachmentDependences(&$uri, &$params, &$criteria, $original) { 
    900         Controller::delete(array('concept' => 'attachment', 'id' => $original['URI']['id'])); 
     1176        Controller::delete(array('concept' => 'attachment', 'id' => (isset($params['attachment']) ? $params['attachment'] : $original['URI']['id']))); 
    9011177    } 
    9021178     
     
    9081184    } 
    9091185 
     1186 
     1187     public function createDefaultGroup(&$uri, &$result, &$criteria, $original) { 
     1188        if( $original['criteria']['filter'][1][0] == '=' && 
     1189        $original['criteria']['filter'][1][1] == 'user' && 
     1190        $original['criteria']['filter'][1][2] == $_SESSION['phpgw_session']['account_id']){ 
     1191 
     1192            $existDefaultGroup = false; 
     1193 
     1194            foreach($result as $v){ 
     1195                if($v['type'] == 1 && $v['calendar']['type'] == 1) 
     1196                    $existDefaultGroup = true; 
     1197            } 
     1198 
     1199            if(!$existDefaultGroup){ 
     1200 
     1201                $cal = array('name' => 'Sem grupo', 
     1202                    'description' => 'Sem grupo', 
     1203                    'timezone' => (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo', 
     1204                    'dtstamp' => time() . '000', 
     1205                    'type' => '1' 
     1206                ); 
     1207 
     1208                $calCreated = Controller::create(array('concept' => 'calendar'), $cal); 
     1209 
     1210                $sig = array('user' => $_SESSION['wallet']['user']['uidNumber'], 
     1211                    'calendar' => $calCreated['id'], 
     1212                    'isOwner' => '1', 
     1213                    'dtstamp' => time() . '000', 
     1214                    'fontColor' => 'FFFFFF', 
     1215                    'backgroundColor' => '3366CC', 
     1216                    'borderColor' => '3366CC', 
     1217                    'type' => '1' 
     1218                ); 
     1219 
     1220                $sigCreated = Controller::create(array('concept' => 'calendarSignature'), $sig); 
     1221                $sigCreated = Controller::read(array('concept' => 'calendarSignature', 'id' => $sigCreated['id']), false, array('deepness' => 2 )); 
     1222 
     1223                array_push($result, $sigCreated); 
     1224            } 
     1225 
     1226        } 
     1227 
     1228     } 
     1229 
    9101230    public function createDefaultSignature(&$uri, &$result, &$criteria, $original) { 
     1231 
     1232    if(count($result) == 0 && isset($criteria['filter'][3]) && isset($criteria['filter'][3]['isRecursion'])){ 
     1233        throw new Exception('It was not possible to find to calendar!'); 
     1234        return false; 
     1235    } 
    9111236 
    9121237        //Caso uma busca não retorne nenhum resultado e foi buscado pelas assinaturas do usuario logado apenas 
     
    9161241        if (count($result) > 0) { 
    9171242            foreach ($result as $value) { 
    918                 if (isset($value['isOwner']) && $value['isOwner'] != 0) 
    919                     $isValidSignature = true; 
     1243                if (isset($value['isOwner']) && $value['isOwner'] != 0 && isset($value['type']) && $value['type'] == 0) 
     1244                    $isValidSignature = true; 
    9201245            } 
    9211246        } 
     
    9281253 
    9291254            if (Config::module('useCaldav', 'expressoCalendar')) { 
    930                 require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php'; 
    931  
    932                 $calendario = DAViCalAdapter::findCalendars(); 
     1255                require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php'; 
     1256                $calendario = DAViCalAdapter::findCalendars(); 
    9331257            } 
    9341258 
    9351259            if (Config::module('useCaldav', 'expressoCalendar') && is_array($calendario) && count($calendario) > 0) { 
    936                 foreach ($calendario as $i => $v) { 
    937  
    938                     $urlA = explode('/', $v->url); 
    939                     $name = isset($v->displayname) ? $v->displayname : $urlA[(count($urlA) - 2)]; 
    940                     $cal = array('name' => $name, 
    941                         'description' => isset($v->description) ? $v->description : $name, 
    942                         'timezone' => isset($v->timezone) ? $v->timezone : (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo', 
    943                         'dtstamp' => time() . '000', 
    944                         'location' => $urlA[(count($urlA) - 3)] . '/' . $urlA[(count($urlA) - 2)] 
    945                     ); 
    946  
    947                     $calCreated = Controller::create(array('concept' => 'calendar'), $cal); 
    948  
    949  
    950  
    951                     $sig = array('user' => $_SESSION['wallet']['user']['uidNumber'], 
    952                         'calendar' => $calCreated['id'], 
    953                         'isOwner' => '1', 
    954                         'dtstamp' => time() . '000', 
    955                         'fontColor' => 'FFFFFF', 
    956                         'backgroundColor' => '3366CC', 
    957                         'borderColor' => '3366CC', 
    958                     ); 
    959  
    960                     $sigCreated = Controller::create(array('concept' => 'calendarSignature'), $sig); 
    961  
    962  
    963                     DAViCalAdapter::importCollection($v->url, $calCreated['id']); 
    964                 } 
     1260                foreach ($calendario as $i => $v) { 
     1261 
     1262                    $urlA = explode('/', $v->url); 
     1263                    $name = isset($v->displayname) ? $v->displayname : $urlA[(count($urlA) - 2)]; 
     1264                    $cal = array('name' => $name, 
     1265                        'description' => isset($v->description) ? $v->description : $name, 
     1266                        'timezone' => isset($v->timezone) ? $v->timezone : (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo', 
     1267                        'dtstamp' => time() . '000', 
     1268                        'location' => $urlA[(count($urlA) - 3)] . '/' . $urlA[(count($urlA) - 2)] 
     1269                    ); 
     1270 
     1271                    $calCreated = Controller::create(array('concept' => 'calendar'), $cal); 
     1272 
     1273                if(!$calCreated){ 
     1274                    throw new Exception('Error to create calendar'); 
     1275                    return false; 
     1276                } 
     1277 
     1278                    $sig = array('user' => $_SESSION['wallet']['user']['uidNumber'], 
     1279                        'calendar' => $calCreated['id'], 
     1280                        'isOwner' => '1', 
     1281                        'dtstamp' => time() . '000', 
     1282                        'fontColor' => 'FFFFFF', 
     1283                        'backgroundColor' => '3366CC', 
     1284                        'borderColor' => '3366CC', 
     1285                    ); 
     1286 
     1287                    $sigCreated = Controller::create(array('concept' => 'calendarSignature'), $sig); 
     1288 
     1289                if(!$sigCreated){ 
     1290                    throw new Exception('Error to create signature'); 
     1291                    return false; 
     1292                } 
     1293 
     1294                    DAViCalAdapter::importCollection($v->url, $calCreated['id']); 
     1295                } 
    9651296            } else { 
    966                 //Criaremos uma agenda padrão 
    967                 $cal = array('name' => 'Calendario', 
    968                     'description' => 'Calendario Padrão', 
    969                     'timezone' => (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo', 
    970                     'dtstamp' => time() . '000' 
    971                 ); 
    972  
    973                 $calCreated = Controller::create(array('concept' => 'calendar'), $cal); 
    974  
    975                 $sig = array('user' => $_SESSION['wallet']['user']['uidNumber'], 
    976                     'calendar' => $calCreated['id'], 
    977                     'isOwner' => '1', 
    978                     'dtstamp' => time() . '000', 
    979                     'fontColor' => 'FFFFFF', 
    980                     'backgroundColor' => '3366CC', 
    981                     'borderColor' => '3366CC', 
    982                 ); 
    983  
    984                 $sigCreated = Controller::create(array('concept' => 'calendarSignature'), $sig); 
    985             } 
    986  
    987             $result = Controller::find($original['URI'], $original['properties'] ? $original['properties'] : null, $original['criteria']); 
     1297                //Criaremos uma agenda padrão 
     1298                $cal = array('name' => 'Calendario', 
     1299                    'description' => 'Calendario Padrão', 
     1300                    'timezone' => (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo', 
     1301                    'dtstamp' => time() . '000' 
     1302                ); 
     1303 
     1304                $calCreated = Controller::create(array('concept' => 'calendar'), $cal); 
     1305 
     1306                $sig = array('user' => $_SESSION['wallet']['user']['uidNumber'], 
     1307                    'calendar' => $calCreated['id'], 
     1308                    'isOwner' => '1', 
     1309                    'dtstamp' => time() . '000', 
     1310                    'fontColor' => 'FFFFFF', 
     1311                    'backgroundColor' => '3366CC', 
     1312                    'borderColor' => '3366CC', 
     1313                ); 
     1314 
     1315                $sigCreated = Controller::create(array('concept' => 'calendarSignature'), $sig); 
     1316        } 
     1317     
     1318        $original['criteria']['filter'][] = array('isRecursion' => true); 
     1319        $result = Controller::find($original['URI'], $original['properties'] ? $original['properties'] : null, $original['criteria']); 
    9881320            return false; 
    989         } 
     1321        } 
    9901322    } 
    9911323 
     
    10171349 
    10181350    public function davcalCreateCollection(&$uri, &$params, &$criteria, $original) { 
    1019         if (Config::module('useCaldav', 'expressoCalendar')) { 
    1020             require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php'; 
    1021             DAViCalAdapter::mkcalendar($params['location'], $params['name'], isset($params['description']) ? $params['description'] : '' ); 
    1022         } 
     1351        if (Config::module('useCaldav', 'expressoCalendar')) { 
     1352            require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php'; 
     1353            DAViCalAdapter::mkcalendar($params['location'], $params['name'], isset($params['description']) ? $params['description'] : '' ); 
     1354           } 
    10231355    } 
    10241356 
    10251357    public function davcalDeleteCollection(&$uri, &$params, &$criteria, $original) { 
    1026         if (Config::module('useCaldav', 'expressoCalendar') && Config::module('onRemoveCascadeCalDav')) { 
    1027             require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php'; 
    1028             $calendar = Controller::read($uri); 
    1029             DAViCalAdapter::rmCalendar($calendar['location']); 
    1030         } 
     1358        if (Config::module('useCaldav', 'expressoCalendar') && Config::module('onRemoveCascadeCalDav')) { 
     1359            require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php'; 
     1360            $calendar = Controller::read($uri); 
     1361            DAViCalAdapter::rmCalendar($calendar['location']); 
     1362        } 
    10311363    } 
    10321364 
    10331365    public function davcalUpdateCollection(&$uri, &$params, &$criteria, $original) { 
    1034         if (Config::module('useCaldav', 'expressoCalendar')) { 
    1035             require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php'; 
    1036             if (isset($params['location'])) { 
    1037                 $calendar = Controller::read($uri); 
    1038                 if ($calendar['location'] !== $params['location']) 
    1039                     DAViCalAdapter::mvcalendar($calendar['location'], $params['location']); 
    1040             } 
    1041         } 
     1366        if (Config::module('useCaldav', 'expressoCalendar')) { 
     1367            require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php'; 
     1368            if (isset($params['location'])) { 
     1369                $calendar = Controller::read($uri); 
     1370                if ($calendar['location'] !== $params['location']) 
     1371                    DAViCalAdapter::mvcalendar($calendar['location'], $params['location']); 
     1372            } 
     1373        } 
    10421374    } 
    10431375 
  • trunk/prototype/modules/calendar/js/calendar.codecs.js

    r6533 r6996  
    2222            fontColor: "fff", 
    2323            timezone: 'America/Sao_Paulo', 
    24             weekStart: 'SUN' 
     24            weekStart: 'SUN', 
     25            useDesktopNotification: 0 
    2526        }; 
    2627 
     
    3132    } 
    3233} 
     34 
     35updateActivity = false; 
    3336 
    3437constantsParticipant = { 
     
    195198        DataLayer.commit( false, false, function(){      
    196199            Calendar.rerenderView(true); 
     200            if(updateActivity) 
     201                refreshTaskActivity(); 
    197202        }); 
    198203    } 
     
    262267                user: User.me.id,        
    263268                calendar: { 
    264                     id: Calendar.calendarOf[form.signature].id, 
     269                    id: !!!parseInt(form.type) ? Calendar.calendarOf[form.signature].id : Calendar.groupOf[form.signature].id, 
    265270                    name: Encoder.htmlEncode(form.name), 
    266271                    description: Encoder.htmlEncode(form.description), 
     
    384389 
    385390       
     391}); 
     392 
     393DataLayer.codec( "schedulable", "taskEdit", { 
     394 
     395    decoder: function( evtObj ){ 
     396        Encoder.EncodeType = "entity"; 
     397         
     398        if( notArray = $.type(evtObj) !== "array" ) 
     399            evtObj = [ evtObj ]; 
     400 
     401        var pref = User.preferences; 
     402                 
     403        var res = $.map(evtObj, function( form ){ 
     404                         
     405            return DataLayer.merge({ 
     406                id: form.idTask, 
     407                percentage: form.percentage, 
     408                type: '2',  
     409                status: form.taskStatus, 
     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                                    { 
     436                                        type: form.alarmType[i],  
     437                                        unit: form.alarmUnit[i],  
     438                                        time: form.alarmTime[i],  
     439                                        id: form.alarmId[i] 
     440                                        } :  
     441{ 
     442                                        type: form.alarmType[i], 
     443                                        unit: form.alarmUnit[i],  
     444                                        time: form.alarmTime[i] 
     445                                        }; 
     446                                }) : [] 
     447                            }; 
     448                                                         
     449                            if(form.startDate){ 
     450                                var tzId =  DataLayer.get('schedulable', form.idEvent).timezone || User.preferences.timezone, 
     451                                formatString = pref.dateFormat + " " + pref.hourFormat; 
     452                                                                 
     453                                DataLayer.put('notification', { 
     454                                    participant: me.id, 
     455                                    type: 'suggestion', 
     456                                    startTime: Date.parseExact(form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ).toString('yyyy-MM-dd HH:mm:00'), 
     457                                    endTime:  Date.parseExact(form.endDate + ( !!form.allDay ? " 00:00": " "+$.trim(form.endHour)), formatString ).toString('yyyy-MM-dd HH:mm:00'), 
     458                                    allDay: ( !!form.allDay ? 1 : 0 ), 
     459                                    schedulable: form.idEvent 
     460                                }); 
     461                                                         
     462                            } 
     463                            return me; 
     464                        }else return(null); 
     465                    }; 
     466                }) 
     467            }, (form.group != form.lastGroup? {calendar: form.group, lastCalendar: form.lastGroup} : {})) 
     468        }); 
     469        return notArray ? res[0] : res; 
     470    }, 
     471 
     472    encoder: function( evtObj ){} 
     473 
    386474}); 
    387475 
     
    510598                calendar: objEvent.calendar, 
    511599                summary: objEvent.summary, 
     600        type: !!objEvent.type ? objEvent.type : 1, 
    512601                description: objEvent.description, 
    513602                timezone: objEvent.timezone, 
     
    595684}); 
    596685 
     686DataLayer.codec( "schedulable", "task", { 
     687 
     688    decoder: function( evtObj ){ 
     689    Encoder.EncodeType = "entity"; 
     690     
     691    if( notArray = $.type(evtObj) !== "array" ) 
     692        evtObj = [ evtObj ]; 
     693 
     694    var pref = User.preferences; 
     695 
     696    var res = $.map(evtObj, function( form ){ 
     697     
     698        var tzId =  form.timezone || Calendar.signatureOf[form.group].calendar.timezone || User.preferences.timezone, 
     699 
     700        formatString = pref.dateFormat + " " + pref.hourFormat; 
     701 
     702        return DataLayer.merge({ 
     703        "class": form["class"], 
     704        startTime: Date.parseExact(form.startDate + " "+$.trim(form.startHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'), 
     705        endTime:  Date.parseExact(form.endDate + " "+$.trim(form.endHour), formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),  //+ (!!form.allDay ? 86400000 : 0) , 
     706        due: (form.dueDate == '' )? 0 : Date.parseExact(form.dueDate + " "+$.trim(form.dueTime) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'), 
     707        allDay: ( !!form.allDay ? 1 : 0 ),       
     708        status: form.taskStatus,       
     709        id: form.idTask, 
     710        location: form.location, 
     711        type: !!form.type ?  form.type : 2, 
     712        percentage: form.percentage, 
     713        priority: form.priority, 
     714        category: form.category, 
     715        summary: form.summary == '' ? 'Tarefa sem título' : form.summary, 
     716        description: form.description, 
     717        timezone: tzId, 
     718        attachments: $.map(form.attachment || [], function( attachment, i ){ 
     719            return { 
     720            attachment: attachment 
     721            } 
     722        }), 
     723        participants: $.map( form.attendee || [], function( attendee, i ){ 
     724 
     725            if( !attendee || attendee === "" ) 
     726            return( null ); 
     727 
     728            var participant = {}; 
     729            participant.user = (attendee!= User.me.id) ? DataLayer.get('participant', attendee).user : attendee ; 
     730 
     731            if( participant.user === User.me.id ){ 
     732            return DataLayer.merge({ 
     733                id: attendee, 
     734                isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ), 
     735                alarms: participant.alarms = $.map( form.alarmTime || [], function( alarmTime, i ){ 
     736                if( alarmTime === "" ) 
     737                    return( null ); 
     738                return !!form.alarmId[i] ? { 
     739                    type: form.alarmType[i],  
     740                    unit: form.alarmUnit[i],  
     741                    time: form.alarmTime[i],  
     742                    id: form.alarmId[i] 
     743                    }: 
     744 
     745                    { 
     746                    type: form.alarmType[i], 
     747                    unit: form.alarmUnit[i],  
     748                    time: form.alarmTime[i] 
     749                    }; 
     750                }), 
     751                status: !!form.status ? form.status : 3 
     752            }, (form.delegatedFrom[i] != '0' && form.delegatedFrom[i] != '')  ? { 
     753                delegatedFrom: form.delegatedFrom[i] 
     754                } : {}); 
     755            }else{ 
     756                return { 
     757                    id: attendee, 
     758                    isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ), 
     759                    isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0 
     760                    }; 
     761            }; 
     762        }) 
     763        }, form.lastGroup ? (( form.lastGroup == form.group ) ? {} : {calendar: form.group, lastGroup: form.lastGroup}) : {calendar: form.group}); 
     764    }); 
     765 
     766    return notArray ? res[0] : res; 
     767    }, 
     768 
     769    encoder: function( evtObj ){ 
     770 
     771    var notArray = false; 
     772       
     773    if( notArray = $.type(evtObj) !== "array" ) 
     774        evtObj = [ evtObj ]; 
     775 
     776    var statusParticipants = {},  isAttendee = false, 
     777    
     778    statusLabels = [ '', 'accepted', 'tentative', 'cancelled', 'unanswered', 'delegated' ], 
     779 
     780    participantInfo = {}, delegatedFrom = {}, me = DataLayer.copy( User.me ); 
     781     
     782    var delegateAttendee = {}; 
     783     
     784    for( var i = 0; i < statusLabels.length; i++ ) 
     785        statusParticipants[ statusLabels[i] ] = 0; 
     786     
     787    var res = $.map(evtObj, function( objEvent ){            
     788             
     789        if(!(typeof(objEvent) == 'object')) 
     790            return (null); 
     791 
     792        var limitAttendee = false; 
     793 
     794        return { 
     795        "class": objEvent["class"], 
     796        id: objEvent.id, 
     797        location: objEvent.location, 
     798        category: objEvent.category, 
     799        taskStatus: objEvent.status, 
     800        groups: Calendar.groups, 
     801        group: objEvent.group ? objEvent.group : objEvent.calendar, 
     802        summary: objEvent.summary, 
     803        type: !!objEvent.type ? objEvent.type : 2, 
     804        description: objEvent.description, 
     805        timezone: objEvent.timezone, 
     806        timezones: Timezone.timezones, 
     807        percentage: (objEvent.percentage) ? objEvent.percentage : '0', 
     808        priority: objEvent.priority, 
     809        startDate: new Date( parseInt(objEvent.startTime) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ), 
     810        startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.startTime)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat), 
     811        endDate: new Date( parseInt(objEvent.endTime) - (!!parseInt(objEvent.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ), 
     812        endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(objEvent.endTime)),  objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'endTime'), User.preferences.hourFormat), 
     813        dueDate: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : new Date( parseInt(objEvent.due) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ), 
     814        dueTime: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.due)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat), 
     815        allDay: !!parseInt( objEvent.allDay ), 
     816            historic: !!objEvent.historic ? decodeHistoric(objEvent) : [] , 
     817        attachments: $.map(objEvent.attachments || [], function( attachment, i ){ 
     818            var attach = DataLayer.get('schedulableToAttachment', attachment, false); 
     819            //TODO - Verificar na API retorno de id sobre os conceitos em que s?o utilizados tabelas de liga??o 
     820            if(!attach.name) return(null);  
     821             
     822            var ext = attach.name.split('.'); 
     823            attach.name = attach.name.length < 10 ?  attach.name : ( ext.length == 1 ? attach.name.substr(0, 10) : (attach.name.substr(0, 6) + '.' +  ext[ext.length -1])); 
     824            attach.size = formatBytes(attach.size); 
     825            return attach; 
     826        }),                      
     827        attendee: $.map(objEvent.participants || [], function( participant, i ){                         
     828 
     829            if(delegateAttendee[participant]) 
     830                return(null); 
     831 
     832            var attend = DataLayer.get('participant', (participant.id || participant)); 
     833            attend.user = DataLayer.get('user', attend.user); 
     834 
     835            statusParticipants[ statusLabels[attend.status] ]++;     
     836 
     837            if(attend.user.mail == User.me.mail) 
     838                isAttendee = true; 
     839 
     840            if( attend.user.id ===  me.id ){ 
     841                participantInfo.user = { 
     842                    id: attend.id, 
     843                    status : attend.status, 
     844                    delegatedFrom: attend.delegatedFrom || '0', 
     845                    acl: attend.acl, 
     846                    receiveNotification : attend.receiveNotification, 
     847                    alarms : $.map(attend.alarms || [], function( alarm ){ 
     848                    var alarm = DataLayer.get('alarm', alarm); 
     849                    return (alarm == "" ? (null) : alarm); 
     850                    }) 
     851                }; 
     852                me = attend; 
     853                return(null); 
     854            }; 
     855 
     856            var person = { 
     857                id: attend.id, 
     858                name: attend.user.name != 'false' ? attend.user.name : '', 
     859                mail: attend.user.mail, 
     860                status : attend.status, 
     861                isExternal: attend.isExternal, 
     862                acl: attend.acl, 
     863                delegatedFrom: attend.delegatedFrom 
     864            }; 
     865 
     866            if(!!parseInt(attend.delegatedFrom)){ 
     867                delegatedFrom[attend.delegatedFrom] = DataLayer.copy(person); 
     868                return(null); 
     869            } 
     870 
     871            if( !!parseInt(attend.isOrganizer)){ 
     872                participantInfo.organizer = DataLayer.copy(person); 
     873                return(null); 
     874            };                   
     875 
     876            return (person); 
     877        }), 
     878        organizer: participantInfo.organizer || me, 
     879        isOrganizer: (participantInfo.organizer || me).id == me.id, 
     880        alarms: !!participantInfo.user ? participantInfo.user.alarms : [], 
     881        status: !!participantInfo.user ? participantInfo.user.status : 1, 
     882        isAttendee: isAttendee, 
     883        me: me, 
     884        delegatedFrom: delegatedFrom, 
     885        statusParticipants: (objEvent.sizeAttendees != "") ? objEvent.statusAttendees : statusParticipants, 
     886        sizeAttendeeLimit: (objEvent.sizeAttendees != "") ? objEvent.sizeAttendees : false 
     887        }; 
     888    }); 
     889    return (notArray ? res[0] : res); 
     890    } 
     891}); 
     892 
     893function decodeHistoric ( evt ) { 
     894    var historic = evt.historic; 
     895    var decoded = []; 
     896    var attributeDecoded = { 
     897        'startTime': 'Data de inicio', 
     898        'endTime' : 'Data de fim', 
     899        'summary' : 'Título', 
     900        'description': 'Descrição', 
     901        'status': 'Status', 
     902        'percentage': 'Porcentagem', 
     903        'priority': 'Priorudade', 
     904        'due' : 'Previsão de término' 
     905    } 
     906     
     907    var statusDecoded = { 
     908        1: 'Sem ações', 
     909        2: 'Em processo', 
     910        3: 'Finalzada', 
     911        4: 'Cancelada', 
     912    } 
     913 
     914    var decodeDate = function(time){ 
     915        return new Date( parseInt( time) ).setTimezoneOffset( Timezone.timezone( evt.timezone ) ).toString( User.preferences.dateFormat+' - '+User.preferences.hourFormat ); 
     916    }; 
     917 
     918    var decodeItem = function(historic){ 
     919        switch(historic.attribute){ 
     920            case 'startTime': 
     921            case 'endTime' : 
     922            case 'due': 
     923                return { 
     924                    user :$.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user), 
     925                    attribute : attributeDecoded[historic.attribute], 
     926                    beforeValue : decodeDate(historic.beforeValue), 
     927                    afterValue : decodeDate(historic.afterValue), 
     928                    time: decodeDate(historic.time) 
     929                } 
     930            break; 
     931            case 'participant': 
     932                return{ 
     933                    user :$.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user), 
     934                    attribute : historic.beforeValue == '' ? ('Novo participante') : ('Rem. participante'), 
     935                    beforeValue : historic.beforeValue == '' ? '' : historic.beforeValue.mail, 
     936                    afterValue : historic.afterValue == '' ? '' : historic.afterValue.mail, 
     937                    time: decodeDate(historic.time) 
     938                } 
     939            break; 
     940            case 'attachment': 
     941                return{ 
     942                    user : $.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user), 
     943                    attribute : historic.beforeValue == '' ? ('Novo anexo') : ('Rem. anexo'), 
     944                    beforeValue : historic.beforeValue, 
     945                    afterValue : historic.afterValue, 
     946                    time: decodeDate(historic.time) 
     947                } 
     948            case 'percentage': 
     949                    return{ 
     950                    user :$.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user), 
     951                    attribute :attributeDecoded[historic.attribute], 
     952                    beforeValue : historic.beforeValue+' %', 
     953                    afterValue : historic.afterValue+' %', 
     954                    time: decodeDate(historic.time) 
     955                } 
     956            case 'status': 
     957                    return{ 
     958                    user :$.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user), 
     959                    attribute :attributeDecoded[historic.attribute], 
     960                    beforeValue : statusDecoded[historic.beforeValue], 
     961                    afterValue : statusDecoded[historic.afterValue], 
     962                    time: decodeDate(historic.time) 
     963                } 
     964            break; 
     965            default: 
     966                return { 
     967                    user : $.type(historic.user) == 'object' ? historic.user : DataLayer.get('user', historic.user), 
     968                    attribute : attributeDecoded[historic.attribute], 
     969                    beforeValue : historic.beforeValue, 
     970                    afterValue : historic.afterValue, 
     971                    time: decodeDate(historic.time) 
     972                } 
     973            break; 
     974 
     975        } 
     976    } 
     977 
     978    for(var i = 0; i < historic.length; i++) 
     979        decoded.push(decodeItem(historic[i])); 
     980 
     981    return decoded; 
     982 
     983} 
     984 
     985DataLayer.codec( "schedulable", "taskSearch", { 
     986 
     987    decoder: function( evtObj ){ 
     988 
     989    }, 
     990 
     991    encoder: function( evtObj ){ 
     992 
     993    var notArray = false; 
     994       
     995    if( notArray = $.type(evtObj) !== "array" ) 
     996        evtObj = [ evtObj ]; 
     997 
     998    var res = $.map(evtObj, function( objEvent ){            
     999             
     1000        if(!(typeof(objEvent) == 'object')) 
     1001            return (null); 
     1002 
     1003        return { 
     1004            id: objEvent.id, 
     1005            description: !!objEvent.summary ? objEvent.summary : objEvent.description, 
     1006            startDate: new Date( parseInt(objEvent.startTime) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ), 
     1007            startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.startTime)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat), 
     1008            endDate: new Date( parseInt(objEvent.endTime) - (!!parseInt(objEvent.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ), 
     1009            endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(objEvent.endTime)),  objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'endTime'), User.preferences.hourFormat), 
     1010            dueDate: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : new Date( parseInt(objEvent.due) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ), 
     1011            dueTime: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.due)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat), 
     1012            allDay: !!parseInt( objEvent.allDay ), 
     1013            percentage: (objEvent.percentage) ? objEvent.percentage : '0', 
     1014                        status: objEvent.status 
     1015        } 
     1016    }); 
     1017    return (notArray ? res[0] : res); 
     1018    } 
     1019}); 
     1020 
     1021DataLayer.codec( "schedulable", "activity", { 
     1022 
     1023    decoder: function( evtObj ){ 
     1024    Encoder.EncodeType = "entity"; 
     1025     
     1026    if( notArray = $.type(evtObj) !== "array" ) 
     1027        evtObj = [ evtObj ]; 
     1028 
     1029    var pref = User.preferences; 
     1030 
     1031    var res = $.map(evtObj, function( form ){ 
     1032     
     1033        var tzId =  form.timezone || Calendar.signatureOf[form.group].calendar.timezone || User.preferences.timezone, 
     1034        formatString = pref.dateFormat + " " + pref.hourFormat; 
     1035 
     1036        var decodeParticipants = function(attend){ 
     1037            return [DataLayer.merge( 
     1038                {   
     1039                    user: User.me.id,  
     1040                    isOrganizer: 1, 
     1041                    acl: 'row', 
     1042                    alarms: $.map( form.alarmTime || [], function( alarmTime, i ){ 
     1043                        if( alarmTime === "" ) 
     1044                            return( null ); 
     1045                        return !!form.alarmId[i] ? { 
     1046                            type: form.alarmType[i],  
     1047                            unit: form.alarmUnit[i],  
     1048                            time: form.alarmTime[i],  
     1049                            id: form.alarmId[i] 
     1050                            }: 
     1051 
     1052                            { 
     1053                            type: form.alarmType[i], 
     1054                            unit: form.alarmUnit[i],  
     1055                            time: form.alarmTime[i] 
     1056                            }; 
     1057                    }) 
     1058                }, attend != '0' ? {id: attend} : {})]; 
     1059        }; 
     1060 
     1061        return DataLayer.merge({ 
     1062        "class": form["class"], 
     1063        startTime: Date.parseExact(form.startDate + " "+$.trim(form.startHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'), 
     1064        endTime:  Date.parseExact(form.endDate + " "+$.trim(form.endHour), formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'),  //+ (!!form.allDay ? 86400000 : 0) , 
     1065        due: (form.dueDate == '' )? 0 : Date.parseExact(form.dueDate + " "+$.trim(form.dueHour) , formatString ).toString(!!form.allDay ? 'yyyy-MM-dd 00:00:00' : 'yyyy-MM-dd HH:mm:00'), 
     1066        allDay: ( !!form.allDay ? 1 : 0 ),       
     1067        status: form.activityStatus,       
     1068        id: form.idActivity, 
     1069        type: !!form.type ?  form.type : 2, 
     1070        percentage: form.percentage, 
     1071        priority: form.priority, 
     1072        category: form.category, 
     1073        summary: form.summary == '' ? 'Atividade sem título' : form.summary, 
     1074        description: form.description, 
     1075        timezone: tzId, 
     1076        attachments: $.map(form.attachment || [], function( attachment, i ){ 
     1077            return { 
     1078            attachment: attachment 
     1079            } 
     1080        }), 
     1081        participants: decodeParticipants(form.idAttendee), 
     1082        taskToActivity:$.map( form.idtask || [], function( task, i ){ 
     1083 
     1084            return DataLayer.merge({ 
     1085                task: task, 
     1086                owner: User.me.id 
     1087            }, form.idTaskToActivity[i] != '' ? {id: form.idTaskToActivity[i]} : {}); 
     1088 
     1089        }) 
     1090        }, form.lastGroup ? (( form.lastGroup == form.group ) ? {} : {calendar: form.group, lastGroup: form.lastGroup}) : {calendar: form.group}); 
     1091    }); 
     1092 
     1093    return notArray ? res[0] : res; 
     1094    }, 
     1095 
     1096    encoder: function( evtObj ){ 
     1097 
     1098    var notArray = false; 
     1099       
     1100    if( notArray = $.type(evtObj) !== "array" ) 
     1101        evtObj = [ evtObj ]; 
     1102     
     1103    var res = $.map(evtObj, function( objEvent ){            
     1104             
     1105        if(!(typeof(objEvent) == 'object')) 
     1106            return (null); 
     1107         
     1108        var historic = []; 
     1109 
     1110        var decodeTasks = function(obj){ 
     1111 
     1112            var tasks = {}, task = {}; 
     1113 
     1114            for(var i =0; i < obj.taskToActivity.length; i++){ 
     1115 
     1116                taskToActivity = DataLayer.get('taskToActivity', obj.taskToActivity[i]);  
     1117                task = taskToActivity.task; 
     1118 
     1119                if($.type(task) != 'object') 
     1120                    task = DataLayer.get('schedulable', task); 
     1121 
     1122                tasks[task.id] = { 
     1123                    taskToActivity: taskToActivity.id, 
     1124                    allDay: !!parseInt(task.allDay), 
     1125                    dueDate: (!task.due || task.due == '' || task.due == '0') ? '' : new Date( parseInt(task.due) ).setTimezoneOffset( Timezone.timezone( task.timezone ) ).toString( User.preferences.dateFormat ), 
     1126                    dueTime: (!task.due || task.due == '' || task.due == '0') ? '' : dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(task.due)), task.timezone, obj.calendar, obj.DayLigth, 'startTime'), User.preferences.hourFormat), 
     1127                    startDate: new Date( parseInt(task.startTime) ).setTimezoneOffset( Timezone.timezone( task.timezone ) ).toString( User.preferences.dateFormat ), 
     1128                    startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(task.startTime)), task.timezone, task.calendar, obj.DayLigth, 'startTime'), User.preferences.hourFormat), 
     1129                    endDate: new Date( parseInt(task.endTime) - (!!parseInt(task.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( task.timezone ) ).toString( User.preferences.dateFormat ), 
     1130                    endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(task.endTime)),  task.timezone, obj.calendar, obj.DayLigth, 'endTime'), User.preferences.hourFormat), 
     1131                    status: task.status, 
     1132                    percentage: task.percentage 
     1133                } 
     1134 
     1135                tasks[task.id].description = tasks[task.id].startDate + ' - ' + (!!task.summary ? task.summary : task.description); 
     1136 
     1137                historic.push({'task': (!!task.summary ? task.summary : task.description) , 'historic': decodeHistoric(task)}); 
     1138            } 
     1139 
     1140            tasks.length = obj.taskToActivity.length; 
     1141            return tasks; 
     1142 
     1143        }; 
     1144 
     1145        return { 
     1146        "class": objEvent["class"], 
     1147        id: objEvent.id, 
     1148        location: objEvent.location, 
     1149        category: objEvent.category, 
     1150        activityStatus: objEvent.status, 
     1151        groups: Calendar.groups, 
     1152        group: objEvent.group ? objEvent.group : objEvent.calendar, 
     1153        summary: objEvent.summary, 
     1154        type: !!objEvent.type ? objEvent.type : 2, 
     1155        description: objEvent.description, 
     1156        timezone: objEvent.timezone, 
     1157        timezones: Timezone.timezones, 
     1158        percentage: (objEvent.percentage) ? objEvent.percentage : '0', 
     1159        priority: objEvent.priority, 
     1160        startDate: new Date( parseInt(objEvent.startTime) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ), 
     1161        startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.startTime)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat), 
     1162        endDate: new Date( parseInt(objEvent.endTime) - (!!parseInt(objEvent.allDay) ? 86400000 : 0)  ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ), 
     1163        endHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date(parseInt(objEvent.endTime)),  objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'endTime'), User.preferences.hourFormat), 
     1164        dueDate: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : new Date( parseInt(objEvent.due) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ), 
     1165        dueTime: (!objEvent.due || objEvent.due == '' || objEvent.due == '0') ? '' : dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.due)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat), 
     1166        allDay: !!parseInt( objEvent.allDay ), 
     1167        historic: historic, 
     1168        tasks: objEvent.taskToActivity ? decodeTasks(objEvent) : {}, 
     1169        attachments: $.map(objEvent.attachments || [], function( attachment, i ){ 
     1170            var attach = DataLayer.get('schedulableToAttachment', attachment, false); 
     1171            //TODO - Verificar na API retorno de id sobre os conceitos em que s?o utilizados tabelas de liga??o 
     1172            if(!attach.name) return(null);  
     1173             
     1174            var ext = attach.name.split('.'); 
     1175            attach.name = attach.name.length < 10 ?  attach.name : ( ext.length == 1 ? attach.name.substr(0, 10) : (attach.name.substr(0, 6) + '.' +  ext[ext.length -1])); 
     1176            attach.size = formatBytes(attach.size); 
     1177            return attach; 
     1178        }), 
     1179        me : User.me, 
     1180        attendee: $.map(objEvent.participants || [], function( participant, i ){                         
     1181 
     1182            var attend = DataLayer.get('participant', (participant.id || participant)); 
     1183            attend.user = DataLayer.get('user', attend.user); 
     1184 
     1185            return { 
     1186                id: attend.id, 
     1187                alarms : $.map(attend.alarms || [], function( alarm ){ 
     1188                    var alarm = DataLayer.get('alarm', alarm); 
     1189                    return (alarm == "" ? (null) : alarm); 
     1190                }) 
     1191            }; 
     1192        }) 
     1193 
     1194        }; 
     1195    }); 
     1196    return (notArray ? res[0] : res); 
     1197    } 
     1198}); 
    5971199 
    5981200function decodeOwnerCalendar(calendar){ 
     
    7271329                id: form.idEvent, 
    7281330                location: form.location, 
     1331                type: 1, 
    7291332                category: form.category, 
    730                 summary: form.summary, 
     1333                summary: form.summary == '' ? 'Evento sem título' : form.summary, 
    7311334                description: form.description, 
    7321335                timezone: tzId, 
     
    8001403 
    8011404        var pref = User.preferences; 
    802  
    803         var res =  DataLayer.encode('schedulable:preview', evtObj); 
     1405    var res = []; 
     1406 
     1407    for(var i = 0; i < evtObj.length; i++){ 
     1408           res.push(DataLayer.encode('schedulable:' + (evtObj[i].type == '1' ?  'preview' : ( !!evtObj[i].taskToActivity ? 'activity': 'task')) , evtObj[i])); 
     1409    } 
    8041410 
    8051411        if( !notArray ){ 
     
    8141420 
    8151421            for (var i=0; i < res.length; i++) { 
     1422 
     1423        res[i].type = (res[i].type == '2' && !!res[i].tasks) ? '3' : res[i].type; 
    8161424                           
    8171425                var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat ); 
     
    8361444                        'endDate': new Date( occurrences[ii] + duration ).toString( User.preferences.dateFormat ) 
    8371445                        } ); 
    838                                    
    839                                    
    840                                    
    841                                    
    842                     res2.repeat = typeRepeat[res[i].repeat.frequency]; 
     1446 
     1447                    if(res[i].repeat) 
     1448                res2.repeat = typeRepeat[res[i].repeat.frequency]; 
    8431449                                   
    8441450                    while (counter.compareTo( currentDate ) == 0) { 
     
    8641470 
    8651471        return notArray ? res[0] : res; 
     1472    } 
     1473 
     1474}); 
     1475 
     1476 
     1477DataLayer.codec( "schedulable", "print", { 
     1478 
     1479    decoder: function( evtObj ){ 
     1480 
     1481    }, 
     1482 
     1483 
     1484    encoder: function( evtObj ){ 
     1485     
     1486    if(!(!!evtObj)) 
     1487        evtObj = []; 
     1488 
     1489    var notArray = false; 
     1490           
     1491    if( notArray = $.type(evtObj) !== "array" ) 
     1492        evtObj = [ evtObj ]; 
     1493 
     1494    var pref = User.preferences; 
     1495    var res = []; 
     1496 
     1497    for(var i = 0; i < evtObj.length; i++){ 
     1498       res.push(DataLayer.encode('schedulable:' + (evtObj[i].type == '1' ?  'preview' : 'task'), evtObj[i])); 
     1499    } 
     1500 
     1501    if( !notArray ){ 
     1502        var dates = {}; 
     1503 
     1504        var typeRepeat = { 
     1505        'none': false,  
     1506        'daily': 'Repetição diária', 
     1507        'weekly': 'Repetição semanal', 
     1508        'monthly': 'Repetição mensal', 
     1509        'yearly': 'repetição anual' 
     1510        } 
     1511 
     1512        for (var i=0; i < res.length; i++) { 
     1513            var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat ); 
     1514            var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat ); 
     1515                   
     1516            var duration = parseInt( endDate.getTime() ) - parseInt( startDate.getTime() ); 
     1517             
     1518            var occurrences = [ startDate.getTime() ]; 
     1519                     
     1520            if( res[i].occurrences ) 
     1521            { 
     1522                occurrences = res[i].occurrences; 
     1523            } 
     1524 
     1525            for( var ii = 0; ii < occurrences.length; ii++ ) 
     1526            { 
     1527                var currentDate = new Date( occurrences[ii] ); 
     1528                var counter = currentDate.clone(); 
     1529                         
     1530                var res2 = $.extend( {}, res[i], { 
     1531                    'startDate': currentDate.toString( User.preferences.dateFormat ),  
     1532                    'endDate': new Date( occurrences[ii] + duration ).toString( User.preferences.dateFormat ) 
     1533                }); 
     1534 
     1535                if(res[i].repeat) 
     1536                    res2.repeat = typeRepeat[res[i].repeat.frequency]; 
     1537                       
     1538                var index = dateCalendar.dayNames[counter.getDay()] +' '+counter.toString('dd/MM'); 
     1539 
     1540                if(!dates[index] || !$.isArray(dates[index].events)) 
     1541                    dates[index] = {events:  []};                     
     1542 
     1543                                res2['isOneDay'] = res2.startDate == res2.endDate ? true : false; 
     1544 
     1545                dates[index].events.push(res2); 
     1546                   
     1547            } 
     1548        } 
     1549 
     1550        var calendarView = $('#calendar').fullCalendar('getView'); 
     1551        var start = calendarView.start.getTime(); 
     1552        var end = (calendarView.end.getTime() - (calendarView.name == 'month' ? 86400000 : 0 )); 
     1553        var next = start; 
     1554        var response = []; 
     1555 
     1556        while (next){ 
     1557            var index = dateCalendar.dayNames[new Date(next).getDay()] +' '+ new Date(next).toString('dd/MM'); 
     1558             
     1559            var event = {}; 
     1560            event[index] = {events: dates[index] ? dates[index].events : false}; 
     1561 
     1562            response[response.length] = event; 
     1563            next = (next + 86400000) > end ? false : (next + 86400000); 
     1564        } 
     1565        res = {events: response}; 
     1566    } 
     1567 
     1568    return notArray ? res[0] : res; 
    8661569    } 
    8671570 
     
    9521655                        attendee = DataLayer.get('participant', evt.participants[i]); 
    9531656                        if(attendee.user == User.me.id) 
    954                             return (attendee.acl.indexOf('w') >= 0 || attendee.acl.indexOf('o') >= 0 ) ? { 
     1657                                            return (attendee.acl.indexOf('w') >= 0 || attendee.acl.indexOf('o') >= 0 ) ?  
     1658                                                { 
    9551659                                selectable: true,  
    9561660                                className: 'fullcalendar-context-menu  event-id-'+idEvent+' calendar-id-'+calendar.id+ (isRecurrence ? ' isRecurrence Recurrence-id-'+Recurrence : '') 
     
    9781682                        return returns; 
    9791683                    }                            
    980                     return DataLayer.merge({ 
     1684                    return DataLayer.merge( 
     1685                        { 
    9811686                        editable: aclSignature.acl['write'] && !isRecurrence, 
    9821687                        disableResizing : (((aclSignature.acl['busy'] && !aclSignature.acl['write']) || (!aclSignature.acl['write'] && aclSignature.acl['read'])) ? true : false), 
    9831688                        disableDragging  : (((aclSignature.acl['busy'] && !aclSignature.acl['write']) || (!aclSignature.acl['write'] && aclSignature.acl['read'])) ? true: false), 
    9841689                        className: mountClass(aclSignature.acl) 
    985                     }, aclSignature.acl['busy'] ? { 
    986                         title: 'Ocupado',  
    987                         selectable: false 
    988                     } : { 
    989                         selectable: true 
    990                     }); 
     1690                        }, aclSignature.acl['busy'] ?  
     1691                        { 
     1692                            title: 'Ocupado',  
     1693                            selectable: false 
     1694                        } : { 
     1695                            selectable: true 
     1696                        });      
    9911697                } 
    992                          
    9931698            } 
    9941699                 
     
    10051710 
    10061711            //occurrences = DataLayer.unique( occurrences ).sort(); 
    1007                    
    1008             for( var i = 0; i < occurrences.length; i++ ) 
    1009                 grouped[ evt.calendar ].push( DataLayer.merge({ 
    1010                     id: evt.URI || evt.id+ '-' + i, 
    1011                     title: Encoder.htmlDecode(evt.summary), 
    1012                     start: Timezone.getDateCalendar(new Date( parseInt( occurrences[i] ) ), calendar.timezone,  !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving), 
    1013                     end:   Timezone.getDateCalendar(new Date( parseInt( occurrences[i] ) + duration - (!!parseInt(evt.allDay) ? 86400000 : 0)), calendar.timezone, !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving), 
    1014                     allDay: parseInt( evt.allDay ), 
    1015                     isRepeat: isRepeat, 
    1016                     occurrence: i, 
    1017                     calendar: evt.calendar 
    1018                     }, eventEditable(evt.id, isRepeat, i ) ) ); 
     1712                var typeEvent;   
     1713            for( var i = 0; i < occurrences.length; i++ ){ 
     1714 
     1715            typeEvent = (evt.type == 2 && evt.taskToActivity ? 3 : evt.type) 
     1716                grouped[ evt.calendar ].push( DataLayer.merge( 
     1717                { 
     1718                    id: evt.URI || evt.id+ '-' + i, 
     1719                    title: Encoder.htmlDecode(evt.summary), 
     1720                    start: Timezone.getDateCalendar(new Date( parseInt( occurrences[i] ) ), calendar.timezone,  !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving), 
     1721                    end:   Timezone.getDateCalendar(new Date( parseInt( occurrences[i] ) + duration - (!!parseInt(evt.allDay) ? 86400000 : 0)), calendar.timezone, !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving), 
     1722                    allDay: parseInt( evt.allDay ), 
     1723                    isRepeat: isRepeat, 
     1724                    occurrence: i, 
     1725                    type: typeEvent, 
     1726                    calendar: evt.calendar 
     1727                    }, (parseInt(typeEvent) == 1 ? eventEditable(evt.id, isRepeat, i ) : (parseInt(typeEvent) == 2 ? {editable: true, disableResizing: false, disableDragging: false} : {editable: false, disableResizing: true, disableDragging: true}) )) ); 
     1728        } 
    10191729        }); 
    10201730 
     
    10491759                            ] 
    10501760                        ], 
    1051                         ['IN', 'calendar',  Calendar.calendarIds] 
     1761                        ['IN', 'calendar',  $.merge( Calendar.calendarIds, Calendar.groupIds )] 
    10521762                ],  
    10531763            criteria: { 
  • trunk/prototype/modules/calendar/js/calendar.shared.js

    r6992 r6996  
    11function show_modal_shared(calendarId){ 
    2  
    3         var html = DataLayer.render('templates/shared_calendar.ejs', { 
     2    $('.qtip.qtip-blue').remove(); 
     3 
     4    var html = DataLayer.render('templates/shared_calendar.ejs', { 
    45        calendar: Calendar.calendars, 
    56        signature : Calendar.signatures 
     
    337338 
    338339function show_modal_search_shared(){ 
     340    $('.qtip.qtip-blue').remove(); 
    339341 
    340342    var html = DataLayer.render('templates/shared_calendar.ejs', {});    
  • trunk/prototype/modules/calendar/js/helpers.js

    r6956 r6996  
    101101} 
    102102 
    103 /* 
    104 function listEvents(){ 
    105         var list = $('.fc-header-right').find('.fc-button.fc-button-agendaDay').clone(); 
     103function printNow(){ 
     104 
     105        var window_print = window.open('','ExpressoCalendar','width=800,height=600,scrollbars=yes');         
     106        window_print.document.open(); 
     107 
     108        var start = $("#calendar").fullCalendar('getView').visStart.getTime()/1000; 
     109        var end = $("#calendar").fullCalendar('getView').visEnd.getTime()/1000; 
     110        var criteria = DataLayer.criteria("schedulable:calendar", {'start':start, 'end':end} ); 
     111         
     112        var data = DataLayer.get("schedulable:print", criteria);         
     113 
     114        if($("#calendar").fullCalendar('getView').name == "month"){                              
     115                window_print.document.write(DataLayer.render('templates/calendar_month_print.ejs', { 
     116                        'InfoPage' : $("#calendar").fullCalendar('getView').title, 
     117                        'days' : data 
     118                } )); 
     119        } 
     120        if($("#calendar").fullCalendar('getView').name == "agendaDay"){                          
     121                window_print.document.write(DataLayer.render('templates/calendar_day_print.ejs', { 
     122                        'InfoPage' : $("#calendar").fullCalendar('getView').title, 
     123                        'days' : data 
     124                } )); 
     125        } 
     126        if($("#calendar").fullCalendar('getView').name == "agendaWeek"){ 
     127                window_print.document.write(DataLayer.render('templates/calendar_week_print.ejs', { 
     128                        'InfoPage' : $("#calendar").fullCalendar('getView').title, 
     129                        'days' : data 
     130                })); 
     131                 
     132                var aux = 0; 
     133                setTimeout(function(){$(window_print.document).find(".all-day").each(function(){ 
     134                        if($(this).height() > aux) 
     135                                aux = $(this).height(); 
     136                }); 
     137                $(window_print.document).find(".all-day").each(function(){ 
     138                        $(this).height(aux); 
     139                }); 
     140                $(window_print.document).find(".all-day-line .write").height(aux); 
     141                aux = 0; 
     142                },20); 
     143        } 
     144        if($("#calendar").fullCalendar('getView').name == "year"){       
     145                window_print.document.write(DataLayer.render('templates/calendar_year_print.ejs', { 
     146                        'html' : $('#calendar .fc-content').html(), 
     147                        'header': $('#calendar').find('.fc-header-center h2').text() 
     148                } )); 
     149        }                
     150        window_print.document.close(); 
     151        setTimeout(window_print.print(), 300); 
     152} 
     153 
     154function printEvents(){ 
     155        //var html = DataLayer.render( path + 'templates/attendee_permissions.ejs', {} ); 
     156        var print = $('.fc-header-right').find('.fc-button.fc-button-agendaDay').clone(); 
     157 
    106158        $('.fc-header-right').find('.fc-button-year').toggleClass('fc-corner-right'); 
    107         list.addClass('fc-corner-right'); 
    108         list.addClass('fc-button-listagem'); 
    109         list.removeClass('fc-button-agendaDay'); 
    110         list.removeClass('fc-corner-left'); 
    111         list.find('.fc-button-content').html('Listagem'); 
    112         $('.fc-header-right').append(list); 
    113 } 
    114 */ 
     159        print.addClass('fc-corner-right'); 
     160        print.addClass('fc-button-print'); 
     161        print.removeClass('fc-button-agendaDay'); 
     162        print.removeClass('fc-corner-left'); 
     163        print.find('.fc-button-content').html('Imprimir'); 
     164        $('.fc-header-right').append(print); 
     165        $('.fc-button-print').click(function(){ 
     166            alert('A tela de impressão será melhor visualizada com a preferência "Paisagem" do seu browser selecionada.'); 
     167            printNow(); 
     168        }); 
     169} 
    115170 
    116171/* 
     
    122177function eventDetails( objEvent, decoded, path, isMail, repeat) 
    123178{ 
     179 
     180    $('.qtip.qtip-blue').remove(); 
     181 
    124182    attendees = {}; 
    125183         
     
    399457        modal:true,  
    400458        autoOpen: false, 
    401         width:702,  
     459        width:701,  
    402460        position: 'center',  
    403461        close: function(event, ui) { 
     
    936994// load template of attendees 
    937995var blkAddAtendee = UI.dialogs.addEvent.find('#calendar_addevent_details6').append(attendeeHtml); 
    938 if(objEvent.attendee.length) 
    939     callbackAttendee(); 
     996if(objEvent.attendee.length)  
     997                callbackAttendee();  
    940998/** 
    941                                 Opções de delegação do participante/organizer 
    942                         */               
     999Opções de delegação do participante/organizer 
     1000*/               
    9431001blkAddAtendee.find(".button.participant-delegate").button({ 
    9441002    icons: { 
     
    9681026 
    9691027UI.dialogs.addEvent.find(".attendee-list-add .add-attendee-input input").Watermark("digite um email para convidar"); 
    970 /* Trata a edição de um novo participante adicionado 
    971                         *  
    972                         */ 
     1028/*  
     1029 * Trata a edição de um novo participante adicionado 
     1030 */ 
    9731031var hasNewAttendee = false; 
    9741032                         
     
    9781036                         
    9791037blkAddAtendee.find('.attendee-list-add .add-attendee-input input').keydown(function(event) { 
    980                                  
    9811038    if (event.keyCode == '13' && $(this).val() != '' || (event.keyCode == undefined && $(this).val() != '')) { 
    9821039        Encoder.EncodeType = "entity"; 
     
    9901047 
    9911048        /** 
    992                                          * email válido? 
    993                                          */ 
     1049        * email válido? 
     1050        */ 
    9941051        info.match(/^[\w!#$%&'*+\/=?^`{|}~-]+(\.[\w!#$%&'*+\/=?^`{|}~-]+)*@(([\w-]+\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/) ?  
    9951052        newAttendeeEmail = info : newAttendeeName = info; 
    9961053 
    9971054        /** 
    998                                          * 1) busca no banco para saber se o usuário já existe 
    999                                          *              1.1) se existe, atualiza as info na lista de participantes e nao abre o tooltip 
    1000                                          *              1.2) se não existe 
    1001                                          *                      a) salva como novo usuario externo no banco (apenas com email) 
    1002                                          *                      b) exibe tooltip pedindo o nome 
    1003                                          *                      c) se o usuário preenche tooltip e salva, atualiza com o nome o usuário recém criado 
    1004                                          *                      d) se o usuário cancela o tooltip, fica o usuário salvo apenas com email e sem nome 
    1005                                          */ 
     1055        * 1) busca no banco para saber se o usuário já existe 
     1056        *               1.1) se existe, atualiza as info na lista de participantes e nao abre o tooltip 
     1057        *               1.2) se não existe 
     1058        *                       a) salva como novo usuario externo no banco (apenas com email) 
     1059        *                       b) exibe tooltip pedindo o nome 
     1060        *                       c) se o usuário preenche tooltip e salva, atualiza com o nome o usuário recém criado 
     1061        *                       d) se o usuário cancela o tooltip, fica o usuário salvo apenas com email e sem nome 
     1062        */ 
    10061063 
    10071064        var user = DataLayer.get('user', ["=", "mail", $(this).val()]); 
     
    10121069                                         
    10131070        /** 
    1014                                          * guarda o último tooltip aberto referente à lista de participantes  
    1015                                          */ 
     1071        * guarda o último tooltip aberto referente à lista de participantes  
     1072        */ 
    10161073        lastEditAttendeeToolTip = []; 
    10171074 
    10181075        /** 
    1019                                          * Valida email e salva um participante externo  
    1020                                          */ 
     1076        * Valida email e salva um participante externo  
     1077        */ 
    10211078        var saveContact = function() { 
    10221079            Encoder.EncodeType = "entity"; 
     
    11921249    $(this).val(''); 
    11931250 
    1194 } else if (!skipAddNewLine) {            
     1251} else if (!skipAddNewLine) { 
    11951252    /** 
    1196                                                 * a) salva como novo usuario externo no banco (apenas com email) e... 
    1197                                                 * adiciona novo contato externo à lista de convidados 
    1198                                                 */ 
     1253    * a) salva como novo usuario externo no banco (apenas com email) e... 
     1254    * adiciona novo contato externo à lista de convidados 
     1255    */ 
    11991256 
    12001257    userId = DataLayer.put('user', { 
     
    12851342 
    12861343/**  
    1287                         * Trata a busca de usuários para adição de participantes 
    1288                         */ 
     1344* Trata a busca de usuários para adição de participantes 
     1345*/ 
    12891346blkAddAtendee.find('.add-attendee-search .ui-icon-search').click(function(event) { 
    12901347    blkAddAtendee.find('.add-attendee-search input').keydown(); 
     
    13741431    } 
    13751432}); 
     1433 
    13761434//$('.block-add-attendee .search-result-list').selectable(); 
    13771435 
     
    13951453                        }); 
    13961454                }); 
    1397                 $('.attachment-list input').remove(); 
    1398                 $('.row.fileupload-buttonbar .attachments-list p').remove(); 
     1455                $('div.new-event-win .attachment-list input').remove(); 
     1456                $('div.new-event-win .row.fileupload-buttonbar .attachments-list p').remove(); 
     1457                $('div.new-event-win .btn-danger.delete').addClass('hidden'); 
    13991458            } 
    14001459        }}); 
     
    14151474    text: false 
    14161475}); 
    1417 var maxSizeFile = 2000000; 
    1418 $('#fileupload').fileupload({ 
    1419     sequentialUploads: true, 
    1420     add: function (e, data) { 
    1421         if(data.files[0].size < maxSizeFile) 
    1422             data.submit(); 
    1423     }, 
    1424     change: function (e, data) { 
    1425         $.each(data.files, function (index, file) { 
    1426             var attach = {}; 
    1427             attach.fileName = file.name; 
    1428             var ext = file.name.split('.'); 
    1429             if(file.name.length > 10) 
    1430                 attach.fileName = ext.length == 1 ? file.name.substr(0, 10) :  file.name.substr(0, 6) + '.' + ext[ext.length -1]; 
    1431             attach.fileSize = formatBytes(file.size); 
    1432             if(file.size > maxSizeFile) 
    1433                 attach.error = 'Tamanho de arquivo nao permitido!!' 
    1434                                  
    1435             $('.attachments-list').append(DataLayer.render(path+'templates/attachment_add_itemlist.ejs', { 
    1436                 file : attach 
    1437             })); 
    1438                                  
    1439             if(file.size < maxSizeFile){ 
    1440                 $('.fileinput-button.new').append(data.fileInput[0]).removeClass('new'); 
    1441                 $('.attachments-list').find('[type=file]').addClass('hidden'); 
    1442                                          
    1443             }else 
    1444                 $('.fileinput-button.new').removeClass('new'); 
    1445                                  
    1446                                  
    1447             $('.attachments-list').find('.button.close').button({ 
    1448                 icons: { 
    1449                     primary: "ui-icon-close" 
    1450                 }, 
    1451                 text: false 
    1452             }).click(function(){ 
    1453                 var idAttach = $(this).parent().find('input[name="fileId[]"]').val(); 
    1454                 $('.attachment-list').find('input[value="'+idAttach+'"]') 
    1455                 $(this).parent().remove(); 
    1456             });  
    1457                                  
    1458         }) 
    1459         }, 
    1460     done: function(e, data){ 
    1461         var currentUpload = $('.progress.after-upload:first').removeClass('after-upload').addClass('on-complete').hide(); 
    1462  
    1463         if(!!data.result && data.result != "[]"){ 
    1464             var newAttach = (attch = jQuery.parseJSON(data.result)) ? attch : jQuery.parseJSON(data.result[0].activeElement.childNodes[0].data); 
    1465             $('.attachment-list').append('<input tyepe="hidden" name="attachment[]" value="'+newAttach['attachment'][0][0].id+'"/>'); 
    1466             currentUpload.removeClass('on-complete').parents('p') 
    1467             .append('<input type="hidden" name="fileId[]" value="'+newAttach['attachment'][0][0].id+'"/>') 
    1468             .find('.status-upload').addClass('ui-icon ui-icon-check'); 
    1469         }else 
    1470             currentUpload.removeClass('on-complete').parents('p').find('.status-upload').addClass('ui-icon ui-icon-cancel'); 
    1471     } 
    1472 }); 
    1473 $('.attachments-list .button').button(); 
    1474  
    1475 if(!!window.FormData)                    
    1476 $('#fileupload').bind('fileuploadstart', function () { 
    1477     var widget = $(this), 
    1478     progressElement = $('#fileupload-progress').fadeIn(), 
    1479     interval = 500, 
    1480     total = 0, 
    1481     loaded = 0, 
    1482     loadedBefore = 0, 
    1483     progressTimer, 
    1484     progressHandler = function (e, data) { 
    1485         loaded = data.loaded; 
    1486         total = data.total; 
    1487     }, 
    1488     stopHandler = function () { 
    1489         widget 
    1490         .unbind('fileuploadprogressall', progressHandler) 
    1491         .unbind('fileuploadstop', stopHandler); 
    1492         window.clearInterval(progressTimer); 
    1493         progressElement.fadeOut(function () { 
    1494             progressElement.html(''); 
    1495         }); 
    1496     }, 
    1497     formatTime = function (seconds) { 
    1498         var date = new Date(seconds * 1000); 
    1499         return ('0' + date.getUTCHours()).slice(-2) + ':' + 
    1500         ('0' + date.getUTCMinutes()).slice(-2) + ':' + 
    1501         ('0' + date.getUTCSeconds()).slice(-2); 
    1502     }, 
    1503     /* formatBytes = function (bytes) { 
    1504             if (bytes >= 1000000000) { 
    1505                 return (bytes / 1000000000).toFixed(2) + ' GB'; 
    1506             } 
    1507             if (bytes >= 1000000) { 
    1508                 return (bytes / 1000000).toFixed(2) + ' MB'; 
    1509             } 
    1510             if (bytes >= 1000) { 
    1511                 return (bytes / 1000).toFixed(2) + ' KB'; 
    1512             } 
    1513             return bytes + ' B'; 
    1514         },*/ 
    1515     formatPercentage = function (floatValue) { 
    1516         return (floatValue * 100).toFixed(2) + ' %'; 
    1517     }, 
    1518     updateProgressElement = function (loaded, total, bps) { 
    1519         progressElement.html( 
    1520             formatBytes(bps) + 'ps | ' + 
    1521             formatTime((total - loaded) / bps) + ' | ' + 
    1522             formatPercentage(loaded / total) + ' | ' + 
    1523             formatBytes(loaded) + ' / ' + formatBytes(total) 
    1524             ); 
    1525     }, 
    1526     intervalHandler = function () { 
    1527         var diff = loaded - loadedBefore; 
    1528         if (!diff) { 
    1529             return; 
    1530         } 
    1531         loadedBefore = loaded; 
    1532         updateProgressElement( 
    1533             loaded, 
    1534             total, 
    1535             diff * (1000 / interval) 
    1536             ); 
    1537     }; 
    1538     widget 
    1539     .bind('fileuploadprogressall', progressHandler) 
    1540     .bind('fileuploadstop', stopHandler); 
    1541     progressTimer = window.setInterval(intervalHandler, interval); 
    1542 }); 
     1476 
     1477extendsFileupload('event', path); 
    15431478         
    15441479if(objEvent.isShared){ 
     
    15571492} 
    15581493 
    1559 disponibily(objEvent, path, attendees); 
     1494disponibily(objEvent, path, attendees, 'event'); 
    15601495 
    15611496/*Seleciona a agenda padrão para criação de um evento*/ 
     
    15731508 
    15741509UI.dialogs.addEvent.dialog('open'); 
    1575 //$('[href="#calendar_addevent_details7"]').trigger('click'); 
    1576 //$('[href="#calendar_addevent_details2"]').trigger('click'); 
     1510 
    15771511} 
    15781512 
     
    16911625 
    16921626 
    1693 function add_tab_configure_calendar(calendar)  
     1627function add_tab_configure_calendar(calendar, type)  
    16941628{ 
     1629    $('.qtip.qtip-blue').remove(); 
     1630 
    16951631    var calendars = []; 
    16961632    var signatures = []; 
     
    16981634        var calendarAlarms = []; 
    16991635         
    1700     for (var i=0; i<Calendar.signatures.length; i++) { 
    1701         calendars[i]  = Calendar.signatures[i].calendar; 
    1702         signatures[i] = Calendar.signatures[i]; 
    1703         signatures[i].numberDefaultAlarm = signatures[i].defaultAlarms != '' ?  signatures[i].defaultAlarms.length: 0; 
    1704         if (calendar && calendars[i].id == calendar) 
    1705             previewActiveCalendarConf = i; 
    1706     } 
    1707                  
    1708     if(!(document.getElementById('configure_tab'))) 
     1636        for (var i=0; i<Calendar.signatures.length; i++) { 
     1637                if(parseInt(Calendar.signatures[i].calendar.type) == type){ 
     1638                   calendars.push(Calendar.signatures[i].calendar); 
     1639                   signatures.push(Calendar.signatures[i]); 
     1640                   length = signatures.length - 1; 
     1641                   signatures[length].numberDefaultAlarm = signatures[length].defaultAlarms != '' ?  signatures[length].defaultAlarms.length: 0; 
     1642                   if (calendar && calendars[length].id == calendar) 
     1643                           previewActiveCalendarConf = length; 
     1644                } 
     1645   } 
     1646        var tab_selector = ['configure_tab', 'configure_tab_group'];     
     1647    if(!(document.getElementById(tab_selector[type]))) 
    17091648    { 
    17101649        $('.positionHelper').css('display', 'none'); 
    17111650        $('.cal-list-options-btn').removeClass('fg-menu-open ui-state-active'); 
    1712         var tab_title = "Configurações de agendas"; 
    1713         $tabs.tabs( "add", "#configure_tab", tab_title ); 
     1651        if(type == 0){ 
     1652                var tab_title = "Configurações de agendas"; 
     1653        }else{ 
     1654                var tab_title = "Configurações de Grupos"; 
     1655        } 
     1656        $tabs.tabs( "add", "#"+tab_selector[type], tab_title ); 
    17141657                 
    17151658        var dataColorPicker = { 
     
    17341677            DataLayer.render( 'templates/configure_calendars_itemlist.ejs', { 
    17351678                user:User,  
     1679                type:0, 
    17361680                calendar:calendars[nowActive],  
    17371681                signature:signatures[nowActive] 
    17381682                }, function( form_template ){ 
    1739                 var form_content = jQuery('.accordion-user-calendars .ui-accordion-content').eq(nowActive).html( form_template ).find('form'); 
     1683                var form_content = jQuery('#'+tab_selector[type]+' .accordion-user-calendars .ui-accordion-content').eq(nowActive).html( form_template ).find('form'); 
    17401684                form_content.find('.preferences-alarms-list .button').button({ 
    17411685                    text:false,  
     
    17561700 
    17571701                form_content.find('.button-add-alarms').click(function(){ 
    1758                     DataLayer.render( 'templates/alarms_add_itemlist.ejs', {}, function( template ){                                             
     1702                    DataLayer.render( 'templates/alarms_add_itemlist.ejs', {type: 0}, function( template ){                                              
    17591703                        jQuery('.preferences-alarms-list').append(template) 
    17601704                        .find('li:last label:eq(0)').remove().end() 
     
    18621806DataLayer.render( 'templates/configure_calendars.ejs', { 
    18631807    user:User,  
     1808        type: 0, 
    18641809    calendars:calendars,  
    18651810    signatures:signatures 
    18661811}, function( template ){ 
    1867     var template_content = jQuery('#configure_tab').html( template ).find('.configure-calendars-win'); 
     1812    var template_content = jQuery('#'+tab_selector[type]).html( template ).find('.configure-calendars-win'); 
    18681813    template_content.find('.button').button().filter('.save').click(function(evt){ 
    18691814        if(calendarAlarms.length) 
    18701815                DataLayer.removeFilter('calendarSignatureAlarm', {filter: ['IN','id', calendarAlarms]});         
    18711816        template_content.find('form').submit(); 
    1872         $tabs.tabs( "remove", "#configure_tab"); 
     1817        $tabs.tabs( "remove", "#"+tab_selector[type]); 
    18731818        DataLayer.commit( false, false, function( received ){ 
    18741819            delete Calendar.currentViewKey; 
     
    18791824                Calendar.load(); 
    18801825    }).end().filter('.cancel').click(function(evt){ 
    1881         $tabs.tabs( "remove", "#configure_tab"); 
     1826        $tabs.tabs( "remove", "#"+tab_selector[type]); 
    18821827    }); 
    18831828 
     
    19051850        $('.positionHelper').css('display','none'); 
    19061851    $('.cal-list-options-btn').removeClass('fg-menu-open ui-state-active'); 
    1907     $tabs.tabs("select", "#configure_tab"); 
     1852    $tabs.tabs("select", "#"+tab_selector[type]); 
    19081853    $('.accordion-user-calendars').accordion( "activate" , previewActiveCalendarConf ); 
    19091854                 
     
    19131858} 
    19141859 
    1915 function getSelectedCalendars( reverse ){ 
     1860function getSelectedCalendars( reverse, type ){ 
     1861        var selector = ""; 
     1862        if(type == 0) 
     1863                selector = ".my-calendars"; 
     1864        if(type == 1) 
     1865                selector = ".my-groups-task"; 
    19161866    var selecteds = {}; 
    19171867    var cont = 0;  
    19181868    jQuery(function() { 
    1919         jQuery(".my-calendars .calendar-view").each(function(i, obj) {  
     1869        jQuery(selector+" .calendar-view").each(function(i, obj) {  
    19201870            var check_box = obj; 
    19211871            if( reverse ? !check_box.checked : check_box.checked ) { 
     
    19751925 
    19761926function remove_event(eventId, idCalendar){ 
    1977     $.Zebra_Dialog('Tem certeza que deseja excluir o evento?', { 
     1927    $.Zebra_Dialog('Tem certeza que deseja excluir?', { 
    19781928        'type':     'question', 
    19791929        'overlay_opacity': '0.5', 
     
    20291979 
    20301980 
    2031 function remove_calendar(){ 
     1981function remove_calendar(type){ 
    20321982    /* Pode ser assim $('.cal-list-options-btn.ui-state-active').attr('class').replace(/[a-zA-Z-]+/g, ''); */ 
    2033     $.Zebra_Dialog('Todos os eventos desta agenda serão removidos. Deseja prosseguir com a operação?', { 
     1983        if(!!parseInt(type)) 
     1984                var title = 'Todas as tarefas deste grupo serão removidas. Deseja prosseguir com a operação?'; 
     1985        else 
     1986                var title = 'Todos os eventos desta agenda serão removidos. Deseja prosseguir com a operação?'; 
     1987    $.Zebra_Dialog(title, { 
    20341988        'type':     'question', 
    20351989        'overlay_opacity': '0.5', 
     
    20472001                    delete Calendar.currentViewKey; 
    20482002                    Calendar.load(); 
    2049                     refresh_calendars(); 
     2003                    refresh_calendars(type); 
    20502004                }); 
    20512005            } 
     
    20562010} 
    20572011 
    2058 function refresh_calendars(){ 
     2012function refresh_calendars(type){ 
    20592013 
    20602014    var colorsSuggestions = colors_suggestions(); 
     
    20912045                }); 
    20922046        } 
     2047         
    20932048        doMenu(); 
     2049        var currentToolTip = null; 
    20942050        $('#divAppbox').on('scroll',function(){ 
    20952051                if ($('.cal-list-options-btn.fg-menu-open.ui-state-active')){                    
    20962052                        var offset = $('.cal-list-options-btn.fg-menu-open.ui-state-active').offset(); 
    20972053                        if (offset) 
    2098                                 $('.positionHelper').css('top',offset.top); 
     2054                            $('.positionHelper').css('top',offset.top); 
    20992055                } 
     2056 
    21002057                if ($('.button.config-menu.fg-menu-open')){ 
    21012058                        var offset = $('.button.config-menu.fg-menu-open').offset(); 
    21022059                        if (offset) 
    2103                                 $('.positionHelper').css('top',offset.top); 
     2060                            $('.positionHelper').css('top',offset.top); 
    21042061                }                
     2062 
     2063                 
     2064                if ($(".new-group.qtip-active").length || $(".new-calendar.qtip-active").length)                         
     2065                    $('.qtip-active').css('top',currentToolTip.offset().top - 50); 
     2066                 
    21052067        }); 
     2068         
    21062069        $('ul.list-calendars .cal-list-options-btn').on('click',function(){doMenu();});          
    21072070         
     2071 
     2072    /***************************************New Calendar***************************************/ 
    21082073        meu_container.find(".button.new-calendar").button({ 
    21092074            icons: { 
     
    21122077            text: false 
    21132078        }).click(function () { 
    2114                  
    2115             if( $('.qtip.qtip-blue.qtip-active').val() !== ''){ 
    2116                 $(this).qtip({ 
    2117                     show: { 
    2118                     ready: true,  
    2119             solo: true,  
    2120             when: { 
    2121                     event: 'click' 
    2122                     } 
    2123                 }, 
    2124                 hide: false, 
    2125                 content: { 
    2126                 text: $('<div></div>').html( DataLayer.render( 'templates/calendar_quick_add.ejs', {} ) ),  
    2127                 title: { 
    2128                 text:'Nova Agenda',  
    2129                 button: '<a class="button close" href="#">close</a>' 
    2130                 } 
    2131                 }, 
    2132                 style: { 
    2133                 name: 'blue',  
    2134             tip: { 
    2135                 corner: 'leftMiddle' 
    2136                 },  
    2137             border: { 
    2138                 width: 4,  
    2139             radius: 8 
    2140                 },  
    2141             width: { 
    2142                 min: 230,  
    2143             max:230 
    2144                 } 
    2145             }, 
    2146             position: { 
    2147             corner: { 
    2148             target: 'rightMiddle', 
    2149             tooltip: 'leftMiddle' 
    2150             }, 
    2151             adjust: { 
    2152             x:0,  
    2153             y:-12 
    2154             } 
    2155             } 
    2156             }) 
    2157         .qtip("api").onShow = function(arg0) { 
    2158             $('.qtip-active .button.close').button({ 
    2159                 icons: { 
    2160                     primary: "ui-icon-close" 
    2161                 }, 
    2162                 text: false 
    2163             }) 
    2164             .click(function(){ 
    2165                 meu_container.find(".button.new-calendar").qtip('destroy'); 
    2166             }); 
    2167             //TODO emplementar tratamento de duplicação de valores no location 
    2168             $('.qtip-active .button.save').button().click(function(){ 
    2169                 for(var i = 0; i < Calendar.calendars.length; i++){ 
    2170                     if(Calendar.calendars[i].location == ( User.me.uid + '/' + $('.qtip-active input').val())){  
    2171                         $.Zebra_Dialog('O nome desta agenda já está sendo utilizada em uma Url de outra agenda. Por favor, informe outro nome para agenda.',{ 
    2172                             'overlay_opacity': '0.5', 
    2173                             'type': 'warning' 
    2174                         }); 
    2175                         meu_container.find(".button.new").qtip('destroy'); 
    2176                         return; 
    2177                     } 
    2178                 } 
     2079                currentToolTip = $(this); 
     2080        var typeCalendar = !!parseInt($(this).attr('class').match(/[0-9]+/g)) ?  
     2081            {type: 'new-group', title: 'Novo Grupo', typeValue: 1, prompt: 'Nome do grupo'} :  
     2082            {type: 'new-calendar', title: 'Nova Agenda', typeValue: 0, prompt: 'Nome da agenda'} 
     2083                 
     2084            if(!$('.qtip.qtip-blue.qtip-active.'+typeCalendar.type).length){ 
     2085 
     2086            $('.qtip.qtip-blue').remove(); 
     2087 
     2088                $(this).qtip({ 
     2089                                show: { 
     2090                       ready: true,  
     2091                   solo: true,  
     2092                   when: { 
     2093                          event: 'click' 
     2094                       } 
     2095                    }, 
     2096                  hide: false, 
     2097                  content: { 
     2098                          text: $('<div></div>').html( DataLayer.render( 'templates/calendar_quick_add.ejs', {} ) ),  
     2099                          title: { 
     2100                              text: typeCalendar.title,  
     2101                              button: '<a class="button close" href="#">close</a>' 
     2102                          } 
     2103                        }, 
     2104                  style: { 
     2105                          name: 'blue',  
     2106                      tip: { 
     2107                              corner: 'leftMiddle' 
     2108                          },  
     2109                   border: { 
     2110                           width: 4,  
     2111                           radius: 8 
     2112                          },  
     2113                      width: { 
     2114                              min: 230,  
     2115                          max:230 
     2116                          } 
     2117                    }, 
     2118               position: { 
     2119                       corner: { 
     2120                           target: 'rightMiddle', 
     2121                           tooltip: 'leftMiddle' 
     2122                       }, 
     2123                       adjust: { 
     2124                            x:0,  
     2125                            y: -12 
     2126                                                 
     2127                       } 
     2128                    } 
     2129            }) 
     2130                .qtip("api").onShow = function(arg0) { 
    21792131                                 
    2180                 var selected; 
    2181                 var color = $('.cal-colors-options-btn').each(function(index){ 
    2182                     if ($(this).is('.color-selected')) 
    2183                         selected = index; 
    2184                 }); 
    2185                 DataLayer.put( "calendarSignature", { 
    2186                     user: User.me.id, 
    2187                     calendar: { 
    2188                         name: Encoder.htmlEncode($('.qtip-active input').val()), 
    2189                         timezone: User.preferences.timezone                              
    2190                     }, 
    2191                     isOwner: 1, 
    2192                     fontColor: colorsSuggestions[selected]['font'].substring(1) , 
    2193                     backgroundColor: colorsSuggestions[selected]['background'].substring(1) , 
    2194                     borderColor: colorsSuggestions[selected]['border'].substring(1) 
    2195                 }); 
    2196                 DataLayer.commit( false, false, function( received ){ 
    2197                     delete Calendar.currentViewKey; 
    2198                     Calendar.load(); 
    2199                     refresh_calendars(); 
    2200                 }); 
    2201                 meu_container.find(".button.new").qtip('destroy'); 
    2202             }); 
    2203                          
    2204             $('.qtip-active .button.cancel').button().click(function(){ 
    2205                 meu_container.find(".button.new").qtip('destroy'); 
    2206             }); 
    2207                          
    2208             $(".qtip-active input").Watermark("Nome da agenda"); 
    2209                          
    2210             $('.qtip-active').keydown(function(event) { 
    2211                 if (event.keyCode == '27') { 
    2212                     meu_container.find(".button.new").qtip('destroy'); 
    2213                 } 
    2214             }); 
    2215                          
    2216             $('.colors-options').prepend(buttons_colors); 
    2217             $('.colors-options .signed-cal-colors-options-btn-0').addClass('color-selected'); 
    2218                                          
    2219             var buttons = $('.cal-colors-options-btn').button(); 
    2220                          
    2221             buttons.click(function(){ 
    2222                 buttons.removeClass('color-selected'); 
    2223                 $(this).addClass('color-selected'); 
    2224             }); 
    2225         }                                
    2226         } 
     2132                    $('.qtip-active .button.close').button({ 
     2133                          icons: { 
     2134                              primary: "ui-icon-close" 
     2135                          }, 
     2136                          text: false 
     2137                    }) 
     2138                    .click(function(){ 
     2139                              $('.qtip.qtip-blue').remove(); 
     2140                    }); 
     2141                     
     2142                 $('.qtip-active').addClass(typeCalendar.type); 
     2143 
     2144                    $('.qtip-active .button.save').button().click(function(){ 
     2145                    if(!typeCalendar.typeValue) 
     2146                                for(var i = 0; i < Calendar.calendars.length; i++){ 
     2147                                    if(Calendar.calendars[i].location == ( User.me.uid + '/' + $('.qtip-active input').val())){  
     2148                                        $.Zebra_Dialog('O nome desta agenda já está sendo utilizada em uma Url de outra agenda. Por favor, informe outro nome para agenda.',{ 
     2149                                            'overlay_opacity': '0.5', 
     2150                                            'type': 'warning' 
     2151                                        }); 
     2152                                        $('.qtip.qtip-blue').remove(); 
     2153                                        return; 
     2154                                    } 
     2155                                } 
     2156                                         
     2157                        var selected; 
     2158                        var color = $('.cal-colors-options-btn').each(function(index){ 
     2159                            if ($(this).is('.color-selected')) 
     2160                                 selected = index; 
     2161                        }); 
     2162                        DataLayer.put( "calendarSignature", { 
     2163                            user: User.me.id, 
     2164                            calendar: { 
     2165                                name: Encoder.htmlEncode($('.qtip-active input').val()), 
     2166                                timezone: User.preferences.timezone, 
     2167                        type: typeCalendar.typeValue                     
     2168                            }, 
     2169                            isOwner: 1, 
     2170                            fontColor: colorsSuggestions[selected]['font'].substring(1) , 
     2171                            backgroundColor: colorsSuggestions[selected]['background'].substring(1) , 
     2172                            borderColor: colorsSuggestions[selected]['border'].substring(1) 
     2173                        }); 
     2174                        DataLayer.commit( false, false, function( received ){ 
     2175                            delete Calendar.currentViewKey; 
     2176                            Calendar.load(); 
     2177                            refresh_calendars(); 
     2178                        }); 
     2179                        $('.qtip.qtip-blue').remove(); 
     2180                    }); 
     2181                                 
     2182                    $('.qtip-active .button.cancel').button().click(function(){ 
     2183                        meu_container.find(".button.new").qtip('destroy'); 
     2184                    }); 
     2185                                 
     2186                    $(".qtip-active input").Watermark(typeCalendar.prompt); 
     2187