Changeset 6996 for trunk/prototype


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

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

Location:
trunk/prototype
Files:
33 edited
41 copied

Legend:

Unmodified
Added
Removed
  • 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                                 
     2188                    $('.qtip-active').keydown(function(event) { 
     2189                            if (event.keyCode == '27')  
     2190                              meu_container.find(".button.new").qtip('destroy'); 
     2191                    }); 
     2192                                 
     2193                    $('.colors-options').prepend(buttons_colors); 
     2194                    $('.colors-options .signed-cal-colors-options-btn-0').addClass('color-selected'); 
     2195                                                 
     2196                    var buttons = $('.cal-colors-options-btn').button(); 
     2197                                 
     2198                    buttons.click(function(){ 
     2199                        buttons.removeClass('color-selected'); 
     2200                        $(this).addClass('color-selected'); 
     2201                    }); 
     2202                }                                
     2203           } 
    22272204    }); 
    2228          
     2205 
    22292206    $("img.cal-list-img").click(function(evt) { 
    2230         $(".cal-list-options_1").toggleClass( "hidden" ); 
     2207           $(".cal-list-options_1").toggleClass( "hidden" ); 
    22312208    }); 
    22322209 
     2210    $(".my-groups-task a.title-my-calendars").click(function() { 
     2211        $(".my-groups-task ul.my-list-calendars").toggleClass("hidden") 
     2212        $('.my-groups-task .status-list').toggleClass("ui-icon-triangle-1-s"); 
     2213        $('.my-groups-task .status-list').toggleClass("ui-icon-triangle-1-e"); 
     2214    }); 
     2215 
    22332216    $(".my-calendars a.title-my-calendars").click(function() { 
    2234         $(".my-calendars ul.my-list-calendars").toggleClass("hidden") 
    2235         $('.my-calendars .status-list').toggleClass("ui-icon-triangle-1-s"); 
    2236         $('.my-calendars .status-list').toggleClass("ui-icon-triangle-1-e"); 
     2217        $(".my-calendars ul.my-list-calendars").toggleClass("hidden") 
     2218        $('.my-calendars .status-list').toggleClass("ui-icon-triangle-1-s"); 
     2219        $('.my-calendars .status-list').toggleClass("ui-icon-triangle-1-e"); 
    22372220    }); 
    22382221                 
    22392222    $(".signed-calendars a.title-signed-calendars").click(function() { 
    2240         $(".signed-calendars ul.signed-list-calendars").toggleClass( "hidden"); 
     2223           $(".signed-calendars ul.signed-list-calendars").toggleClass( "hidden"); 
    22412224    }); 
    22422225 
     
    22702253                 
    22712254    $('.calendar-view').click(function(evt){ 
    2272         if($tabs.tabs('option' ,'selected') == 1){ 
    2273             pageselectCallback('', 0); 
     2255        if($tabs.tabs('option' ,'selected') != 0){ 
     2256            pageselectCallback('', 0, false, type); 
    22742257        } 
    22752258                         
     
    22852268} 
    22862269 
    2287 function add_events_list(keyword) 
     2270function add_events_list(keyword, type) 
    22882271{ 
    22892272    var tab_title = "";  
    22902273    if (keyword){ 
    2291         if(keyword.length < 10) 
    2292             tab_title = keyword;  
    2293         else 
    2294             tab_title = keyword.substr(0,10) + '..."';  
     2274                type = 2; 
     2275                if(keyword.length < 10) 
     2276                        tab_title = keyword;  
     2277                else 
     2278                        tab_title = keyword.substr(0,10) + '..."';  
    22952279    }else{ 
    2296         tab_title = "Lista de eventos"; 
    2297     } 
     2280                if(type){ 
     2281                        if(!!parseInt(type)) 
     2282                                tab_title = "Lista de tarefas"; 
     2283                        else 
     2284                                tab_title = "Lista de eventos"; 
     2285                } 
     2286    } 
     2287        var tab_selector = ['tab_events_list_', 'tab_tasks_list_', 'tab_all_list_']; 
    22982288    keyword = ( keyword || '' ).replace( /\s+/g, "_" ); 
    22992289         
    2300     if(!(document.getElementById('tab_events_list_' + (Base64.encode(keyword)).replace(/[^\w\s]/gi, "") )))      
     2290    if(!(document.getElementById(tab_selector[type] + (Base64.encode(keyword)).replace(/[^\w\s]/gi, "") )))      
    23012291    { 
    23022292        Encoder.EncodeType = "entity"; 
    2303         $tabs.tabs( "add", "#tab_events_list_" + (Base64.encode(keyword)).replace(/[^\w\s]/gi, ""), Encoder.htmlEncode(tab_title) ); 
     2293        $tabs.tabs( "add", "#"+tab_selector[type] + (Base64.encode(keyword)).replace(/[^\w\s]/gi, ""), Encoder.htmlEncode(tab_title) ); 
    23042294    } 
    23052295    else /* Tab already opened */ 
    23062296    { 
    2307         $tabs.tabs("option", "selected", 2); 
    2308     } 
    2309          
    2310     pageselectCallback(keyword, 0); // load page 1 and insert data on event_list.ejs 
     2297                //$tabs.tabs("option", "selected", 2); 
     2298        } 
     2299         
     2300    pageselectCallback(keyword, 0, false, type); // load page 1 and insert data on event_list.ejs 
    23112301         
    23122302    $('.preferences-win.active .button.save, .preferences-win.active .button.cancel, .preferences-win.active .button.import, .preferences-win.active .button.export').button(); 
     
    23282318        if(paginator.indexOf('next') > 0){ 
    23292319            if(parseInt($(currentView+' [name = results]').val()) > 25) 
    2330                 pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($(currentView+' [name = page_index]').val())) +1)); 
     2320                pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($(currentView+' [name = page_index]').val())) +1), false,  2); 
    23312321        }else{ 
    23322322            if(parseInt($(currentView+' [name = page_index]').val()) > 0) 
    2333                 pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($(currentView+' [name = page_index]').val())) -1)); 
     2323                pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($(currentView+' [name = page_index]').val())) -1), false, 2); 
    23342324        } 
    23352325    }); 
     
    23692359} 
    23702360 
    2371 function paginatorList(currentView, view){ 
    2372     $(currentView+' .events-list.events-list-win.active .list-events-paginator .fc-header-title').html('<h2>'+mountTitleList( parseInt($('[name = page_index]').val()),view)+'</h2>'); 
     2361function paginatorList(currentView, view, type){ 
     2362    $(currentView+' .events-list.events-list-win.active .list-events-paginator .fc-header-title').html('<h2>'+mountTitleList( parseInt($(currentView+' [name = page_index]').val()),view)+'</h2>'); 
    23732363    $(currentView+' .events-list.events-list-win.active .header-paginator .fc-header-right .fc-button').removeClass('fc-state-active') 
    23742364    if(view == 'basicDay') 
     
    23902380        var goView = $(this).attr('class'); 
    23912381        if(goView.indexOf('agendaDay') > 0) 
    2392             pageselectCallback($(currentView+' [name = keyword]').val(), 0, '', 'agendaDay'); 
     2382            pageselectCallback($(currentView+' [name = keyword]').val(), 0, 'agendaDay', type); 
    23932383        else if(goView.indexOf('month') > 0) 
    2394             pageselectCallback($(currentView+' [name = keyword]').val(), 0, '', 'month'); 
     2384            pageselectCallback($(currentView+' [name = keyword]').val(), 0, 'month', type); 
    23952385        else if(goView.indexOf('year') > 0) 
    2396             pageselectCallback($(currentView+' [name = keyword]').val(), 0, '', 'year'); 
     2386            pageselectCallback($(currentView+' [name = keyword]').val(), 0, 'year', type); 
    23972387        else if(goView.indexOf('agendaWeek') > 0) 
    2398             pageselectCallback($(currentView+' [name = keyword]').val(), 0, '', 'agendaWeek'); 
     2388            pageselectCallback($(currentView+' [name = keyword]').val(), 0, 'agendaWeek', type); 
    23992389 
    24002390    }); 
     
    24122402        var paginator = $(this).attr('class'); 
    24132403        if(paginator.indexOf('next') > 0) 
    2414             pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($('[name = page_index]').val())) +1), '', view); 
     2404            pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($(currentView+' [name = page_index]').val())) +1), view, type); 
    24152405        else 
    2416             pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($('[name = page_index]').val())) -1), '', view); 
     2406            pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($(currentView+' [name = page_index]').val())) -1), view, type); 
    24172407    });  
    24182408} 
    24192409 
    2420 function paginatorListEvent(currentView, typeView, view){ 
     2410function printEventList(view){ 
     2411        $('.fc-button-print.print-list-events').click(function(){ 
     2412                var window_print = window.open('','ExpressoCalendar','width=800,height=600,scrollbars=yes'); 
     2413                var listEvents = $(view).clone(); 
     2414                listEvents.find('.fc-button').remove(); 
     2415                listEvents.find('.details-event-list').remove(); 
     2416                listEvents.find('.list-events-paginator').attr( "align" , "center"  ); 
     2417                listEvents = listEvents.html(); 
     2418                type = $(this).parents('.ui-tabs-panel').attr("id").split("_")[1]; 
     2419                var data = { 
     2420                        type : type == "tasks" ? "task-list" : ( type == "events" ? "event-list" : "search"), 
     2421                        html : listEvents 
     2422                } 
     2423                window_print.document.open();            
     2424                window_print.document.write(DataLayer.render('templates/calendar_list_print.ejs', data)); 
     2425                window_print.document.close(); 
     2426                window_print.print(); 
     2427        }); 
     2428} 
     2429 
     2430function paginatorListEvent(currentView, typeView, view, type){ 
    24212431    if(!!$(currentView).find('.fc-calendar').length) 
    24222432        return; 
     
    24302440    $(currentView+' .events-list.events-list-win.active .fc-header .fc-header-center').addClass('list-events-paginator'); 
    24312441    $(currentView+' .events-list.events-list-win.active .fc-header .list-events-paginator').removeClass('fc-header-center');             
    2432                  
     2442                 
    24332443    //Adicionar class no header padronizar com a tela principal 
    2434     $(currentView+' .events-list.events-list-win.active .fc-header').addClass('header-paginator'); 
    2435     $(currentView+' .events-list.events-list-win.active .header-paginator').removeClass('fc-header'); 
    2436                                  
     2444        $(currentView+' .events-list.events-list-win.active .fc-header .fc-button-print').addClass('print-list-events');                 
     2445        $(currentView+' .events-list.events-list-win.active .fc-header').addClass('header-paginator'); 
     2446    $(currentView+' .events-list.events-list-win.active .header-paginator').removeClass('fc-header');    
     2447         
     2448        printEventList(currentView); 
     2449         
    24372450    if(typeView == 'search'){ 
    2438         $(currentView+' .events-list.events-list-win.active .header-paginator .fc-header-right').remove() 
     2451        $(currentView+' .events-list.events-list-win.active .header-paginator .fc-header-right span.fc-button:not(.fc-button-print)').remove(); 
    24392452        $(currentView+' .events-list.events-list-win.active .list-events-paginator .fc-header-title').html('<h2>Resultados para: '+$(currentView+' [name = keyword]').val()+'</h2>'); 
    24402453        if((parseInt($(currentView+' [name = page_index]').val()) == 0) && (parseInt($(currentView+' [name = results]').val()) <= 25)) 
     
    24422455        paginatorSearch(currentView); 
    24432456    }else 
    2444         paginatorList(currentView, view); 
     2457        paginatorList(currentView, view, type); 
    24452458} 
    24462459 
     
    24502463        case 'basicDay': 
    24512464        case 'agendaDay': 
    2452             rangeStart = new Date().add({ 
     2465            rangeStart = new Date.today().add({ 
    24532466                days: page_index 
    24542467            }).getTime(); 
    2455             rangeEnd = rangeStart; 
     2468            rangeEnd = rangeStart + 86400000; 
    24562469            break; 
    24572470        case 'agendaWeek': 
     
    25192532} 
    25202533 
    2521 function pageselectCallback(keyword, page_index, jq, view){ 
    2522          
    2523     var selecteds = getSelectedCalendars(); 
    2524     if(!selecteds && (keyword != '' && keyword != null)){        
    2525         jQuery('#tab_events_list_' + ((Base64.encode(keyword)).replace(/[^\w\s]/gi, "")|| '')).html( 
    2526             '<div title="Lista de eventos" class="events-list events-list-win active empty">' + 
    2527             '<label>Por favor selecione ao menos uma agenda.</label>' + 
     2534function pageselectCallback(keyword, page_index, view, type){ 
     2535    $('.qtip.qtip-blue').remove(); 
     2536        var tab_selector = ['tab_events_list_', 'tab_tasks_list_', 'tab_all_list_']; 
     2537        var tab_title = ['Lista de eventos', 'Lista de tarefas']; 
     2538        var label_noselect_calendar = ['Por favor selecione ao menos uma agenda.', 'Por favor selecione ao menos um grupo.', 'Por favor selecione ao menos uma agenda ou grupo.']; 
     2539        var label_nofound_search = ['Não foi encontrado nenhum evento correspondente à sua pesquisa.', 'Não foi encontrado nenhuma tarefa ou atividade correspondente à sua pesquisa.', 'Não foi encontrado nenhum evento ou tarefa ou atividade correspondente à sua pesquisa.']; 
     2540        var label_nofound = ['Não foram encontrados eventos neste intervalo.', 'Não foram encontradas tarefas ou atividades neste intervalo.', 'Não foram encontrados eventos ou tarefas ou atividades neste intervalo.']; 
     2541        var selecteds = getSelectedCalendars(false, type); 
     2542     
     2543        if(!selecteds && (keyword != '' && keyword != null)){    
     2544        jQuery('#'+tab_selector[type] + ((Base64.encode(keyword)).replace(/[^\w\s]/gi, "")|| '')).html( 
     2545            '<div title="'+tab_title[type]+'" class="events-list events-list-win active empty">' + 
     2546            '<label>'+label_noselect_calendar[type]+'</label>' + 
    25282547            '</div>' 
    25292548            ); 
     
    25452564    var results = DataLayer.get('schedulable:detail', criteria); 
    25462565    keyword = ( keyword || '' ).replace( /\s+/g, "_" );  
    2547 } 
     2566        } 
    25482567// não há resultados     
    25492568 
    2550 var currentView = '#tab_events_list_' + ((Base64.encode(keyword)).replace(/[^\w\s]/gi, "") || ''); 
     2569var currentView = '#'+tab_selector[type] + ((Base64.encode(keyword)).replace(/[^\w\s]/gi, "") || ''); 
    25512570 
    25522571if ((((typeof(results) == 'undefined') || (!results.events_list )) && selecteds) &&(keyword != '' && keyword != null)) { 
    25532572    $(currentView).html( 
    2554                 '<div title="Lista de eventos" class="events-list events-list-win active empty">' + 
    2555                 '<label>Não foi encontrado nenhum evento correspondente à sua pesquisa.</label>' + 
     2573                '<div title="'+title+'" class="events-list events-list-win active empty">' + 
     2574                '<label>'+label_nofound_search[type]+'</label>' + 
    25562575                '</div>' 
    25572576        ); 
     
    25612580                results['page_index'] = page_index; 
    25622581                results['keyword'] = keyword; 
    2563                                  
     2582                results['tab_title'] = tab_title[type];  
    25642583                DataLayer.render( 'templates/event_list.ejs', results, function( html ){ 
    25652584                         
     
    25672586                        $('.events-list-win .menu-container .button').button(); 
    25682587                                                                                                                         
    2569                         $(".event-details-item").parent().click(function(){ 
    2570  
     2588                        $(".event-details-item").parent().click(function(event){ 
     2589                        event.stopImmediatePropagation(); 
    25712590                        $(this).siblings("div.details-event-list").toggleClass("hidden") 
    2572                         .find('.button.delete').click(function(){ 
     2591                        .find('.button.delete').click(function(event){ 
    25732592                                var eventId = $(this).siblings('[name="eventid"]').val(); 
    25742593                                var calendarId = $(this).siblings('[name="calendarid"]').val(); 
    2575  
    25762594                                remove_event(eventId, calendarId); 
     2595                                event.stopImmediatePropagation() 
    25772596                        }) 
    2578                         .end().find('.button.edit').click(function(){                            
    2579                                 eventDetails( DataLayer.get( "schedulable", $(this).siblings('[name="eventid"]').val() ), true );                                        
     2597                        .end().find('.button.edit').click(function(event){       
     2598                                if($(this).siblings('[name="eventtype"]').val() == 1) 
     2599                                        eventDetails( DataLayer.get( "schedulable", $(this).siblings('[name="eventid"]').val() ), true );                
     2600                                else 
     2601                                        taskDetails( DataLayer.get( "schedulable", $(this).siblings('[name="eventid"]').val() ), true ); 
     2602                                         
     2603                                event.stopImmediatePropagation() 
     2604                        }) 
     2605                        .end().find('.button.print').click(function(event){      
     2606                                var window_print = window.open('','ExpressoCalendar','width=800,height=600,scrollbars=yes'); 
     2607                                var html = $(this).parents("td:first").clone(); 
     2608                                html.find(".menu-container.footer-container").remove(); 
     2609                                var html = html.html(); 
     2610                                var data = { 
     2611                                        type : $(this).parents('.details-event-list').hasClass("details-event") ? "event-detail" : "task-detail", 
     2612                                        html : html 
     2613                                } 
     2614                                window_print.document.open();            
     2615                                window_print.document.write(DataLayer.render('templates/calendar_list_print.ejs', data)); 
     2616                                window_print.document.close(); 
     2617                                window_print.print(); 
     2618                                 
     2619                                event.stopImmediatePropagation() 
    25802620                        }); 
    25812621 
    25822622                        }); 
    2583                         paginatorListEvent(currentView, (keyword == '' || keyword == null) ? 'list' : 'search',  !!view ? view : User.preferences.defaultCalView); 
     2623                        paginatorListEvent(currentView, (keyword == '' || keyword == null) ? 'list' : 'search',  !!view ? view : User.preferences.defaultCalView, type); 
    25842624                }); 
    25852625    }else{ 
    25862626                $(currentView).html( 
    2587                         '<div title="Lista de eventos" class="events-list events-list-win active empty">' + 
     2627                        '<div title="'+title+'" class="events-list events-list-win active empty">' + 
    25882628                        '<input type="hidden" name="page_index" value="'+page_index+'"></inpunt>'+ 
    25892629                        '<input type="hidden" name="keyword" value="'+keyword+'"></inpunt>'+ 
    2590                         '<label class="empty-result">Não foram encontrados eventos neste intervalo.</label>' + 
     2630                        '<label class="empty-result">'+label_nofound[type]+'</label>' + 
    25912631                        '</div>' 
    25922632                        ); 
    2593                 paginatorListEvent(currentView, 'list', !!view ? view : User.preferences.defaultCalView); 
    2594     } 
    2595 } 
    2596         if(currentView != '#tab_events_list_') 
     2633                paginatorListEvent(currentView, 'list', !!view ? view : User.preferences.defaultCalView, type); 
     2634    } 
     2635} 
     2636        if(currentView != '#'+tab_selector[type]) 
    25972637            $tabs.tabs("select", currentView); 
    25982638} 
    25992639 
    2600 function show_modal_import_export(tab, calendarId) { 
     2640function show_modal_import_export(tab, calendarId, typeView){ 
     2641    $('.qtip.qtip-blue').remove(); 
    26012642    DataLayer.render( 'templates/import_export.ejs', { 
    2602         calendars: Calendar.calendars,  
    2603         owner: User.me.id 
     2643        calendars: typeView == 0 ? Calendar.calendars : Calendar.groups,  
     2644        owner: User.me.id, 
     2645        typeView: typeView 
    26042646        }, function( html ){ 
    26052647 
    26062648        if (!UI.dialogs.importCalendar) { 
    26072649            UI.dialogs.importCalendar = jQuery('#div-import-export-calendar') 
    2608             .append('<div title="Importar e Exportar Eventos" class="import-export import-export-win active"> <div>') 
     2650            .append('<div title="Importar e Exportar "' + (typeView == 0 ? 'Eventos' : 'Tarefas') + '" class="import-export import-export-win active"> <div>') 
    26092651            .find('.import-export-win.active').html(html).dialog({ 
    26102652                resizable: false,  
     
    28312873    } 
    28322874} 
     2875 
     2876function extendsFileupload(view, path){ 
     2877    var viewName = 'div.new-'+view+'-win'; 
     2878     
     2879    path = !!path ? path : ''; 
     2880     
     2881    var maxSizeFile = 2000000; 
     2882    $('#fileupload'+view).fileupload({ 
     2883        sequentialUploads: true, 
     2884        add: function (e, data) { 
     2885            if(data.files[0].size < maxSizeFile) 
     2886                data.submit(); 
     2887        }, 
     2888        change: function (e, data) { 
     2889            $.each(data.files, function (index, file) { 
     2890                var attach = {}; 
     2891                attach.fileName = file.name; 
     2892                var ext = file.name.split('.'); 
     2893                if(file.name.length > 10) 
     2894                    attach.fileName = ext.length == 1 ? file.name.substr(0, 10) :  file.name.substr(0, 6) + '.' + ext[ext.length -1]; 
     2895                attach.fileSize = formatBytes(file.size); 
     2896                if(file.size > maxSizeFile) 
     2897                    attach.error = 'Tamanho de arquivo nao permitido!!' 
     2898                                 
     2899                $(viewName+' .attachments-list').append(DataLayer.render(path+'templates/attachment_add_itemlist.ejs', { 
     2900                    file : attach 
     2901                })); 
     2902                                 
     2903                if(file.size < maxSizeFile){ 
     2904                    $(viewName+' .fileinput-button.new').append(data.fileInput[0]).removeClass('new'); 
     2905                    $(viewName+' .attachments-list').find('[type=file]').addClass('hidden'); 
     2906                                         
     2907                }else 
     2908                    $(viewName+' .fileinput-button.new').removeClass('new'); 
     2909                                 
     2910                                 
     2911                $(viewName+' .attachments-list').find('.button.close').button({ 
     2912                    icons: { 
     2913                        primary: "ui-icon-close" 
     2914                    }, 
     2915                    text: false 
     2916                }).click(function(){ 
     2917                    var idAttach = $(this).parent().find('input[name="fileId[]"]').val(); 
     2918                    $(viewName+' .attachment-list').find('input[value="'+idAttach+'"]').remove(); 
     2919                    $(this).parent().remove(); 
     2920                 
     2921                    if(!$(viewName+' .attachment-list input').length) 
     2922                        $(viewName+' .btn-danger.delete').addClass('hidden'); 
     2923                 
     2924                });      
     2925                                 
     2926            }) 
     2927        }, 
     2928        done: function(e, data){ 
     2929            var currentUpload = $(viewName+' .progress.after-upload:first').removeClass('after-upload').addClass('on-complete').hide(); 
     2930 
     2931            if(!!data.result && data.result != "[]"){ 
     2932                $(viewName+' .btn-danger.delete').removeClass('hidden'); 
     2933                var newAttach = (attch = jQuery.parseJSON(data.result)) ? attch : jQuery.parseJSON(data.result[0].activeElement.childNodes[0].data); 
     2934                $(viewName+' .attachment-list').append('<input tyepe="hidden" name="attachment[]" value="'+newAttach['attachment'][0][0].id+'"/>'); 
     2935                currentUpload.removeClass('on-complete').parents('p') 
     2936                .append('<input type="hidden" name="fileId[]" value="'+newAttach['attachment'][0][0].id+'"/>') 
     2937                .find('.status-upload').addClass('ui-icon ui-icon-check'); 
     2938            }else 
     2939                currentUpload.removeClass('on-complete').parents('p').find('.status-upload').addClass('ui-icon ui-icon-cancel'); 
     2940        } 
     2941    }); 
     2942    $('.attachments-list .button').button();     
     2943 
     2944    if(!!window.FormData)                        
     2945        $('#fileupload'+view).bind('fileuploadstart', function () { 
     2946            var widget = $(this), 
     2947            progressElement = $('#fileupload-progress-'+view).fadeIn(), 
     2948            interval = 500, 
     2949            total = 0, 
     2950            loaded = 0, 
     2951            loadedBefore = 0, 
     2952            progressTimer, 
     2953            progressHandler = function (e, data) { 
     2954                loaded = data.loaded; 
     2955                total = data.total; 
     2956            }, 
     2957            stopHandler = function () { 
     2958                widget 
     2959                .unbind('fileuploadprogressall', progressHandler) 
     2960                .unbind('fileuploadstop', stopHandler); 
     2961                window.clearInterval(progressTimer); 
     2962                progressElement.fadeOut(function () { 
     2963                    progressElement.html(''); 
     2964                }); 
     2965            }, 
     2966            formatTime = function (seconds) { 
     2967                var date = new Date(seconds * 1000); 
     2968                return ('0' + date.getUTCHours()).slice(-2) + ':' + 
     2969                ('0' + date.getUTCMinutes()).slice(-2) + ':' + 
     2970                ('0' + date.getUTCSeconds()).slice(-2); 
     2971            }, 
     2972            /* formatBytes = function (bytes) { 
     2973            if (bytes >= 1000000000) { 
     2974                return (bytes / 1000000000).toFixed(2) + ' GB'; 
     2975            } 
     2976            if (bytes >= 1000000) { 
     2977                return (bytes / 1000000).toFixed(2) + ' MB'; 
     2978            } 
     2979            if (bytes >= 1000) { 
     2980                return (bytes / 1000).toFixed(2) + ' KB'; 
     2981            } 
     2982            return bytes + ' B'; 
     2983        },*/ 
     2984            formatPercentage = function (floatValue) { 
     2985                return (floatValue * 100).toFixed(2) + ' %'; 
     2986            }, 
     2987            updateProgressElement = function (loaded, total, bps) { 
     2988                progressElement.html( 
     2989                    formatBytes(bps) + 'ps | ' + 
     2990                    formatTime((total - loaded) / bps) + ' | ' + 
     2991                    formatPercentage(loaded / total) + ' | ' + 
     2992                    formatBytes(loaded) + ' / ' + formatBytes(total) 
     2993                    ); 
     2994            }, 
     2995            intervalHandler = function () { 
     2996                var diff = loaded - loadedBefore; 
     2997                if (!diff) { 
     2998                    return; 
     2999                } 
     3000                loadedBefore = loaded; 
     3001                updateProgressElement( 
     3002                    loaded, 
     3003                    total, 
     3004                    diff * (1000 / interval) 
     3005                    ); 
     3006            }; 
     3007            widget 
     3008            .bind('fileuploadprogressall', progressHandler) 
     3009            .bind('fileuploadstop', stopHandler); 
     3010            progressTimer = window.setInterval(intervalHandler, interval); 
     3011        }); 
     3012     
     3013} 
  • trunk/prototype/modules/calendar/js/init.js

    r6444 r6996  
    147147                        }, true ); 
    148148                }); 
     149                 
     150                var currentToolTip = null; 
     151                $('#divAppbox').on('scroll',function(){ 
     152                        if ($(".new-task").length)                       
     153                                currentToolTip.qtip('destroy'); 
     154                }); 
     155                 
     156                /* Quick add task 
     157        -----------------------------------------------------------------*/ 
     158                $(".button.add.add-task").click(function(event){ 
     159                        currentToolTip = $(this); 
     160                        var componente = $(this); 
     161                         
     162            if(!$('div.qtip.qtip-blue.new-task').length){ 
     163 
     164                $('div.qtip.qtip-blue').remove(); 
     165 
     166                        $(componente).qtip({ 
     167                            show: { 
     168                                ready: true,  
     169                                solo: true,  
     170                                when: { 
     171                                        event: 'click' 
     172                                } 
     173                                }, 
     174                                hide: false, 
     175                                content: { 
     176                                        text: $('<div></div>').html( DataLayer.render( 'templates/task_quick_add.ejs', {"componente" : componente} ) ), 
     177                                        title: { 
     178                                                text:'Nova tarefa',  
     179                                                button: '<a class="button close" href="#">close</a>' 
     180                                        } 
     181                                }, 
     182                                style: { 
     183                                        name: 'blue',  
     184                                tip: { 
     185                                                corner: 'leftMiddle' 
     186                                        },  
     187                                border: { 
     188                                            width: 4,  
     189                                            radius: 8 
     190                                        },  
     191                                width: { 
     192                                                min: 225,  
     193                                            max:225 
     194                                        } 
     195                                }, 
     196                        position: { 
     197                                corner: { 
     198                                            target: 'rightMiddle', 
     199                                            tooltip: 'leftMiddle' 
     200                                }, 
     201                                adjust: { 
     202                                            x:0,  
     203                                            y:0 
     204                                } 
     205                        } 
     206                    }) 
     207                .qtip("api").onShow = function(arg0) { 
     208 
     209                        /*------------------------------------------------------------------------*/ 
     210                        /*               Seta os valores padrões nos inputs do qtip               */ 
     211                         $('div.qtip div.add-simple-task input.task').Watermark("Tarefa sem título"); 
     212                             $('div.qtip div.add-simple-task textarea').Watermark("Descrição"); 
     213                        /*------------------------------------------------------------------------*/ 
     214 
     215                            $('.qtip-active .button.close').button({ 
     216                                icons: { 
     217                                    primary: "ui-icon-close" 
     218                                }, 
     219                                text: false 
     220                            }) 
     221                            .click(function(){ 
     222                                        $(componente).qtip('destroy'); 
     223                            }); 
     224                                                         
     225                            $('.qtip-active .button.save').button().click(function(){ 
     226                                 
     227                                var title = $('div.qtip div.add-simple-task input.task').val(); 
     228                                        var description = $('div.qtip div.add-simple-task textarea').val(); 
     229 
     230                                        var calendar, timezone = ''; 
     231 
     232                                        for (var i = 0; i < Calendar.signatures.length; i++){ 
     233                                                if(Calendar.signatures[i].type == 1 && Calendar.signatures[i].calendar.type == 1){ 
     234                                                        calendar = Calendar.signatures[i].calendar.id; 
     235                                                        timezone = Calendar.signatures[i].calendar.timezone; 
     236                                                        break; 
     237                                                } 
     238                                        } 
     239 
     240                                DataLayer.put('schedulable',  
     241                                { 
     242                                        summary: title,  
     243                                        description: description,  
     244                                        type: '2',  
     245                                        calendar: calendar,  
     246                                        timezone: timezone, 
     247                                                        status: '1', 
     248                                        startTime: new Date().toString('yyyy-MM-dd 00:00:00'), 
     249                                        endTime: new Date().toString('yyyy-MM-dd 00:00:00'), 
     250                                        allDay: '1', 
     251                                        participants:  
     252                                        [{   
     253                                            user: User.me.id,  
     254                                            isOrganizer: 1, 
     255                                            acl: 'row' 
     256                                        }] 
     257                                }); 
     258                                 
     259                        $(componente).qtip('destroy'); 
     260 
     261                    }); 
     262 
     263                            $('.qtip-active .button.advanced').button().click(function(){ 
     264 
     265                                var startEvent = new Date(); 
     266                                        var configData = (startEvent.toString('mm') < 30)  ? {minutes: (30 - parseInt(startEvent.toString('mm')))} : {hours: 1, minutes: '-'+startEvent.toString('mm')}; 
     267                                        startEvent.add(configData); 
     268                         
     269                                                var componente = $(this); 
     270                        var description = $('div.qtip div.add-simple-task textarea[name="description"]').val(); 
     271 
     272                                        taskDetails({ 
     273                            summary: $('div.qtip div.add-simple-task input[name="summary"]').val(), 
     274                            description: description == 'Descrição' ? '' : description, 
     275                                                startTime: startEvent.getTime(), 
     276                                                endTime: dateCalendar.decodeRange(startEvent, (!!User.preferences.defaultCalendar ? (   !!Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration ?   
     277                                                        (Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration) : (User.preferences.defaultDuration)) : (User.preferences.defaultDuration))) 
     278                                        }, true ); 
     279 
     280                        $(componente).qtip('destroy'); 
     281                            }); 
     282                                                                 
     283                                $('.qtip-active .button.cancel').button().click(function(){ 
     284                                        $(componente).qtip('destroy'); 
     285                            }); 
     286                                                         
     287                            $('.qtip-active .button').button(); 
     288                         
     289                        $('div.qtip.qtip-blue.qtip-active').addClass('new-task'); 
     290            } 
     291        } 
     292                }); 
     293 
     294        $(".button.add.add-activity").click(function(event){ 
     295                        var startEvent = new Date(); 
     296                        var configData = (startEvent.toString('mm') < 30)  ? {minutes: (30 - parseInt(startEvent.toString('mm')))} : {hours: 1, minutes: '-'+startEvent.toString('mm')}; 
     297                        startEvent.add(configData);  
     298                         
     299                        activityDetails({  
     300                                startTime: startEvent.getTime(), 
     301                                endTime: dateCalendar.decodeRange(startEvent, (!!User.preferences.defaultCalendar ? (   !!Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration ?   
     302                                                (Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration) : (User.preferences.defaultDuration)) : (User.preferences.defaultDuration))) 
     303                        }, true ); 
     304 
     305        }); 
    149306 
    150307        var calendar = $('#calendar').fullCalendar(DataLayer.merge({  
     
    189346                        year: 'ano' 
    190347                }, 
     348                 
     349                eventRender: function( event, element, view ){ 
    191350                /* 
    192                 eventRender: function( event, element, view ){ 
    193                         $(element).attr( 'event-id', event.id ); 
    194                 }, 
    195                 */ 
     351                         * TODO - Encontrar icones mais filé 
     352                         */ 
     353                        var img_icon = ""; 
     354                        if(event.type == 1) 
     355                                img_icon = "mini-event.png"; 
     356                        if(event.type == 2) 
     357                                img_icon = "mini-task.png"; 
     358                        if(event.type == 3) 
     359                                img_icon = "activity_icon.jpg"; 
     360 
     361                         
     362            element.find(".fc-event-inner.fc-event-skin").prepend($('<img style="width: 11px; height: 13px;" class="" src="../prototype/modules/calendar/img/' + img_icon + '"></img>')); 
     363                }, 
     364                 
    196365                select: function( start, end, allDay, event, view ){ 
    197366                        if (view.name == "month") { 
     
    285454                eventClick: function( evt, event, view ){ 
    286455                        evt.id = evt.id.split('-')[0]; 
    287                         if(evt.selectable){ 
    288                             if(evt.isRepeat){ 
    289                                 $.Zebra_Dialog(evt.title + ' é um evento com repetição.', { 
    290                                         'type':     'question', 
    291                                         'overlay_opacity': '0.5', 
    292                                         'buttons':  ['Editar todas ocorrências', 'Editar essa ocorrência'], 
    293                                         'onClose':  function(clicked) { 
    294                                                 if(clicked == 'Editar todas ocorrências') { 
    295                                                     eventDetails( DataLayer.get( "schedulable", evt.id), true); 
    296                                                 }else{ 
    297                                                     /* 
    298                                                     * TODO - repeat foi adicionado pois melhorias devem ser feitas no rollback do 
    299                                                     *DataLayer, repeat somente é usado quando se trata da criação de um evento 
    300                                                     *pela edição de uma ocorrência. 
    301                                                     */       
    302                                                     var repeat = mount_exception(evt.id, evt.occurrence); 
    303                                                                                                    
    304                                                     $('.calendar-copy-move input[name="typeEvent"]').val("3"); 
    305                                                      
    306                                                     eventDetails(copyAndMoveTo(false , evt.id , false, "3", evt), true, '', false, repeat); 
    307                                                 }        
    308                                         } 
    309                                 }); 
    310                                  
    311                             }else{ 
    312                                 var schedulable = DataLayer.get( "schedulable", evt.id); 
    313                                 schedulable.calendar = evt.calendar; 
    314                                 eventDetails( schedulable, true); 
    315                                  
    316                             } 
    317                                  
     456             
     457            switch (parseInt(evt.type)){ 
     458                case 1: 
     459                    if(evt.selectable){ 
     460                        if(evt.isRepeat){ 
     461                            $.Zebra_Dialog(evt.title + ' é um evento com repetição.', { 
     462                                'type':     'question', 
     463                                'overlay_opacity': '0.5', 
     464                                'buttons':  ['Editar todas ocorrências', 'Editar essa ocorrência'], 
     465                                'onClose':  function(clicked) { 
     466                                    if(clicked == 'Editar todas ocorrências') { 
     467                                        eventDetails( DataLayer.get( "schedulable", evt.id), true); 
     468                                    }else{ 
     469                                        /* 
     470                                        * TODO - repeat foi adicionado pois melhorias devem ser feitas no rollback do 
     471                                        *DataLayer, repeat somente é usado quando se trata da criação de um evento 
     472                                        *pela edição de uma ocorrência. 
     473                                        */       
     474                                        var repeat = mount_exception(evt.id, evt.occurrence); 
     475                                                                                           
     476                                        $('.calendar-copy-move input[name="typeEvent"]').val("3"); 
     477                                         
     478                                        eventDetails(copyAndMoveTo(false , evt.id , false, "3", evt), true, '', false, repeat); 
     479                                    }        
     480                                } 
     481                            }); 
     482                        }else{ 
     483                            var schedulable = DataLayer.get( "schedulable", evt.id); 
     484                            schedulable.group = evt.calendar; 
     485                            eventDetails( schedulable, true); 
     486                            } 
    318487                        } 
     488                        break; 
     489                    case 2: 
     490                        var task = DataLayer.get( "schedulable", evt.id); 
     491                        task.group = evt.calendar; 
     492                        taskDetails( task, true); 
     493                        break; 
     494                    case 3: 
     495                        var activity = DataLayer.get( "schedulable", evt.id); 
     496                        activity.group = evt.calendar; 
     497                        activityDetails( activity, true); 
     498                        break; 
     499            } 
    319500                }, 
    320501                 
     
    322503                        contentMenu(); 
    323504                } 
    324         }, dateCalendar)); 
    325   
     505        }, dateCalendar));       
     506                 
     507                 
    326508        contentMenu(); 
    327509          
     
    346528        });        
    347529        //Todo chamada do metodo que adiciona ao full calendar o botao de listagem de eventos   
    348         //listEvents(); 
     530        printEvents(); 
    349531}); 
     532 
     533 
     534function useDesktopNotification(){ 
     535        return !!parseInt(User.preferences.useDesktopNotification); 
     536} 
  • trunk/prototype/modules/calendar/js/load.js

    r6444 r6996  
    11Refresh = { 
    2     //Tempo em que após a ultima sincronização será verificado atualizações 
     2    //Tempo em que após a ultima sincronização será verificado atualizações 
    33    timeRefresh : 180, 
    44    clookRefresh: false, 
     
    88        delete DataLayer.tasks[this.clookRefresh]; 
    99         
    10         //Realiza agendamentos de atualização de view somente se o módulo aberto for expressoCalendar 
     10        //Realiza agendamentos de atualização de view somente se o módulo aberto for expressoCalendar 
    1111        if(User.moduleName == "expressoCalendar"){ 
    1212            this.clookRefresh = (parseInt(($.now()) / 1000) + this.timeRefresh); 
     
    5454    } 
    5555 
    56     this.calendarIds = [], this.signatureOf = {}, this.calendars = [], this.calendarOf= {}; 
     56    this.calendarIds = [], this.groupIds = [], this.signatureOf = {}, this.calendars = [], this.groups = [], this.calendarOf = {}, this.groupOf= {}; 
    5757 
    5858    for( var i = 0; i < this.signatures.length; i++ ){ 
    5959        if(this.signatures[i].isOwner == "0") 
    6060            this.signatures[i].permission =  DataLayer.encode('calendarToPermission:detail', this.signatures[i].permission); 
    61         this.signatureOf[ this.calendarIds[i] = ( this.calendars[ this.calendars.length ] = this.calendarOf[ this.signatures[i].id ] = this.signatures[i].calendar ).id ] = this.signatures[i]; 
     61 
     62        if(this.signatures[i].calendar.type == '1') 
     63           this.signatureOf[ this.groupIds[this.groupIds.length] = ( this.groups[ this.groups.length ] = this.groupOf[ this.signatures[i].id ] = this.signatures[i].calendar ).id ] = this.signatures[i]; 
     64        else 
     65           this.signatureOf[ this.calendarIds[ this.calendarIds.length] = ( this.calendars[ this.calendars.length ] = this.calendarOf[ this.signatures[i].id ] = this.signatures[i].calendar ).id ] = this.signatures[i]; 
    6266    } 
    6367 
     
    6771 
    6872    rerenderView: function(force){ 
    69         //TODO - Remover if quando centralizar o objeto User que contem as informações do usuário logado em um local acessível a todos módulos 
     73        //TODO - Remover if quando centralizar o objeto User que contem as informações do usuário logado em um local acessível a todos módulos 
    7074        if(User.moduleName == "expressoCalendar"){ 
    7175            if((typeof($tabs) != "undefined") && $tabs.tabs('option' ,'selected') == 0){ 
     
    8993                contentMenu(); 
    9094            }else if((typeof($tabs) != "undefined") && $tabs.tabs('option' ,'selected') != 0) 
    91                 pageselectCallback($('.events-list-win.active [name=keyword]').val(), 0); 
     95                                 
     96                pageselectCallback($('.events-list-win.active [name=keyword]').val(), 0, false, ($tabs.tabs('option' ,'selected') > 2) ? 2 : ($tabs.tabs('option' ,'selected') == 1) ? 0 : 1); 
    9297        } 
    9398    } 
    9499} 
    95100 
    96 Alarms = { 
    97     load: function(){ 
    98         var eventsDay = DataLayer.get('alarm:schedulable',['=', 'date', Date.today().getTime()]); 
    99         if(eventsDay) 
    100         for(var i = 0; i < eventsDay.length; i++){ 
    101             this.addAlarm( eventsDay[i] ); 
    102         } 
    103     }, 
    104          
    105     addAlarm: function( eventDay ){             
    106         if(!DataLayer.tasks[parseInt(eventDay.sendTime)]){ 
    107             DataLayer.task( parseInt(eventDay.sendTime) , function( timestamp ){ 
    108                 var path = User.moduleName == 'expressoCalendar' ? '' : '../prototype/modules/calendar/'; 
    109                 DataLayer.render(path+'templates/alarm.ejs',{ 
    110                     event: eventDay 
    111                 }, function( html ){                                 
    112                     $.Zebra_Dialog(html , { 
    113                         'type':     'question', 
    114                         'overlay_opacity': '0.5', 
    115                         'buttons':  ['Fechar'], 
    116                         'onClose':  function(clicked) {} 
    117                     }); 
    118                 }); 
    119             }); 
    120         } 
    121     } 
    122 } 
    123  
    124101Calendar.load(); 
    125 Alarms.load(); 
  • trunk/prototype/modules/calendar/js/map.disponibility.js

    r6444 r6996  
    88 
    99 
    10 function updateMap(data){ 
    11         var start_date = $(".new-event-win.active .start-date").val(); 
    12         var end_date   = $(".new-event-win.active .end-date").val(); 
    13         var start_time = $(".new-event-win.active .start-time").val(); 
    14         var end_time   = $(".new-event-win.active .end-time").val(); 
    15         var isAllDay   = $('.new-event-win.active input[name="allDay"]').is(':checked'); 
     10function updateMap(viewName){ 
     11        var start_date = $(".new-"+viewName+"-win.active .start-date").val(); 
     12        var end_date   = $(".new-"+viewName+"-win.active .end-date").val(); 
     13        var start_time = $(".new-"+viewName+"-win.active .start-time").val(); 
     14        var end_time   = $(".new-"+viewName+"-win.active .end-time").val(); 
     15        var isAllDay   = $('.new-'+viewName+'-win.active input[name="allDay"]').is(':checked'); 
    1616         
    1717        var formatString = User.preferences.dateFormat + " " + User.preferences.hourFormat; 
     
    2121         
    2222         
    23         var event = $("#new_event_map").fullCalendar('clientEvents', 'map')[0]; 
     23        var event = $('.new-'+viewName+'-win .map_disponibility').fullCalendar('clientEvents', 'map')[0]; 
    2424         
    2525         
     
    2828                        event.end = endDate; 
    2929                        event.allDay = isAllDay; 
    30                         $("#new_event_map").fullCalendar( 'updateEvent', event ) 
     30                        $('.new-'+viewName+'-win .map_disponibility').fullCalendar( 'updateEvent', event ) 
    3131                } 
    3232                 
     
    3535 
    3636 
    37 function disponibily(objEvent, path, attendees){ 
     37function disponibily(objEvent, path, attendees, viewName){ 
    3838        var formatString = User.preferences.dateFormat + " " + User.preferences.hourFormat; 
    3939        var startDate = Date.parseExact( objEvent.startDate + " " + $.trim(objEvent.startHour) , formatString ); 
    4040        var endDate = Date.parseExact( objEvent.endDate + " " + $.trim(objEvent.endHour) , formatString ); 
     41 
     42    var dialogName = {event: 'addEvent', task: 'addTask', activity: 'addActivity'} 
    4143          
    4244        var mapHtml = DataLayer.render( path+'templates/availability_map.ejs', {}); 
    43         $("#calendar_addevent_details7").html(mapHtml); 
    44         $("#new_event_map").fullCalendar(DataLayer.merge({ 
     45        $('#calendar_add'+viewName+'_details7').html(mapHtml); 
     46        $('.new-'+viewName+'-win .map_disponibility').fullCalendar(DataLayer.merge({ 
    4547                height : 300, 
    4648                timeFormat: User.preferences.hourFormat, 
     
    7779                        if(!allDay){ 
    7880                                $('[name="allDay"]').attr("checked", false);  
    79                                 UI.dialogs.addEvent.find('.start-time, .end-time').removeClass('hidden'); 
     81                                UI.dialogs[dialogName[viewName]].find('.start-time, .end-time').removeClass('hidden'); 
    8082                                 
    8183                                $('[name="startHour"]').val(start.toString(User.preferences.hourFormat)); 
     
    8587                        }else{ 
    8688                                $('[name="allDay"]').attr("checked", true);  
    87                                 UI.dialogs.addEvent.find('.start-time, .end-time').addClass('hidden'); 
     89                                UI.dialogs[dialogName[viewName]].find('.start-time, .end-time').addClass('hidden'); 
    8890                        } 
    8991                }, 
     
    98100                                className : "map-event", 
    99101                                backgroundColor : "transparent !important", 
    100                                 editable : objEvent.acl.write || objEvent.acl.organization 
     102                                editable : objEvent.acl ? (objEvent.acl.write || objEvent.acl.organization) : true 
    101103                        } 
    102104                ], 
     
    104106                        if(event.allDay){ 
    105107                                $('[name="allDay"]').attr("checked", true);  
    106                                 UI.dialogs.addEvent.find('.start-time, .end-time').addClass('hidden'); 
     108                                UI.dialogs[dialogName[viewName]].find('.start-time, .end-time').addClass('hidden'); 
    107109                                 
    108110                                $('[name="startDate"]').val(dateCalendar.toString(event.start, User.preferences.dateFormat));                            
     
    111113                        }else{ 
    112114                                $('[name="allDay"]').attr("checked", false);  
    113                                 UI.dialogs.addEvent.find('.start-time, .end-time').removeClass('hidden'); 
     115                                UI.dialogs[dialogName[viewName]].find('.start-time, .end-time').removeClass('hidden'); 
    114116                         
    115117                                $('[name="startHour"]').val(dateCalendar.formatDate(event.start, User.preferences.hourFormat)); 
     
    132134        var eventSource = new Array(); 
    133135        var updateMapView = function(){ 
    134                 updateMap(); 
    135                 var view = $("#new_event_map").fullCalendar('getView'); 
     136                updateMap(viewName); 
     137                var view = $('.new-'+viewName+'-win .map_disponibility').fullCalendar('getView'); 
    136138                var map = {}; 
    137                 $("#new_event_map").fullCalendar( 'removeEventSource', eventSource ); 
     139                $('.new-'+viewName+'-win .map_disponibility').fullCalendar( 'removeEventSource', eventSource ); 
    138140                eventSource = new Array();       
    139141                map = {startTime : view.start.getTime(), endTime : view.end.getTime(), attendees: {}, timezone: (objEvent.timezone || User.preferences.timezone)}; 
     
    167169                } 
    168170                if(eventSource.length) 
    169                         $("#new_event_map").fullCalendar( 'addEventSource', eventSource ); 
     171                        $('.new-'+viewName+'-win .map_disponibility').fullCalendar( 'addEventSource', eventSource ); 
    170172        };  
    171         $('[href="#calendar_addevent_details7"]').click(function(eventData, eventObject){ 
    172                 $("#new_event_map").fullCalendar( 'gotoDate', Date.parseExact($('[name="startDate"]').val() + " " + $.trim($('[name="startHour"]').val()), formatString) , formatString); 
    173                 //if(eventObject == undefined) 
    174                         updateMapView(); 
     173        $('[href="#calendar_add'+viewName+'_details7"]').click(function(eventData, eventObject){ 
     174                $('.new-'+viewName+'-win .map_disponibility').fullCalendar( 'gotoDate', Date.parseExact($('[name="startDate"]').val() + " " + $.trim($('[name="startHour"]').val()), formatString) , formatString); 
     175                  updateMapView(); 
    175176        });      
    176         $("#new_event_map").find(".fc-button-prev, .fc-button-next, .fc-button-today").click(function(){ 
     177        $('.new-'+viewName+'-win .map_disponibility').find(".fc-button-prev, .fc-button-next, .fc-button-today").click(function(){ 
    177178                updateMapView(); 
    178179        }); 
  • trunk/prototype/modules/calendar/templates/alarms_add_itemlist.ejs

    r6393 r6996  
    1 <% if(data.alarm){ 
     1<%if(data.alarm){ 
    22        for(var i = 0; i < data.alarm.defaultAlarms.length; i++){%> 
    33                <li class="input-group"> 
     
    1616                        <input type="hidden" name="alarmId[]" value="" /> 
    1717                        <input type="hidden" name="isDefaultAlarm[]" value="<%=data.alarm.useAlarmDefault ? 1 : 0%>" /> 
    18                         <label> antes de cada evento.</label> 
     18                        <%if(!!!parseInt(data.type)){%> 
     19                                <label>antes de cada evento.</label> 
     20                        <%}else{%> 
     21                                <label>antes de cada tarefa.</label> 
     22                        <%}%> 
    1923                        <a class="button remove tiny"></a> 
    2024                </li> 
     
    3539                </select> 
    3640                <input type="hidden" name="alarmId[]" value="" /> 
    37                 <label> antes de cada evento.</label> 
     41                <%if(!!!parseInt(data.type)){%> 
     42                        <label>antes de cada evento.</label> 
     43                <%}else{%> 
     44                        <label>antes de cada tarefa.</label> 
     45                <%}%> 
    3846                <a class="button remove tiny"></a> 
    3947        </li> 
  • trunk/prototype/modules/calendar/templates/availability_map.ejs

    r5636 r6996  
    1 <fieldset id="availability_map" class="tab-level2"> 
    2         <div id="new_event_map" class="map" style="width : 100%;"> 
     1<fieldset class="tab-level2"> 
     2        <div class="map_disponibility" style="width : 100%;"> 
    33        </div> 
    44</fieldset> 
  • trunk/prototype/modules/calendar/templates/calendar_list.ejs

    r5927 r6996  
     1<% 
     2    var signatures = {'calendar': [], 'taskGroup': [], 'sharedCalendar': []}; 
     3    for(var i = 0; i < data.signatures.length; i++) 
     4    { 
     5        if(data.signatures[i].calendar.type == 1){ 
     6            signatures['taskGroup'].push(data.signatures[i]); 
     7        }else{ 
     8            signatures[data.signatures[i].isOwner == 1 ? 'calendar' : 'sharedCalendar'].push(data.signatures[i]);        
     9        } 
     10    } 
     11%> 
     12 
    113<div class="all-list-calendars"> 
    2     <% var signature = data.signatures %> 
    3     <% var external = false %> 
    4     <div class="my-calendars"> 
    5         <a title='Minhas agendas' class="title-my-calendars" aria-expanded='false' role='button' tabindex='0'>Minhas agendas</a> 
     14 
     15    <div class="my-groups-task"> 
     16        <a title='Grupos de tarefas' class="title-my-calendars" aria-expanded='false' role='button' tabindex='0'>Grupos de tarefas</a> 
    617        <span class="status-list ui-icon ui-icon-triangle-1-s"></span> 
    7         <a href="#" class="button new new-calendar">Nova Agenda</a> 
     18        <a href="#" class="button new new-calendar 1">Novo Grupo</a> 
    819        <ul class="list-calendars my-list-calendars"> 
    9             <% for (var i=0; i < signature.length; i++) { 
    10             if(signature[i].isOwner == 1){ 
    11             %> 
    12             <li class="list-calendars-item list-calendars-item-<%= signature[i].calendar.id %>" title="<%= signature[i].calendar.name %>"> 
     20            <% for (var i=0; i < signatures['taskGroup'].length; i++) {%> 
     21            <li class="list-calendars-item list-calendars-item-<%= signatures['taskGroup'][i].calendar.id %>" title="<%= signatures['taskGroup'][i].calendar.name %>"> 
    1322 
    1423                <div> 
    15                     <input class="calendar-view" type="checkbox" name="" value="<%= signature[i].calendar.id %>" checked="checked"/> 
    16                     <label><%= signature[i].calendar.name %></label> 
     24                    <input class="calendar-view" type="checkbox" name="" value="<%= signatures['taskGroup'][i].calendar.id %>" checked="checked"/> 
     25                    <label><%= signatures['taskGroup'][i].calendar.name %></label> 
    1726 
    1827                </div>  
    19                 <a class="cal-list-options-btn my-cal-list-options-btn-<%= signature[i].calendar.id %>" style="background-color:#<%=signature[i].backgroundColor%>; border-color:#<%= signature[i].borderColor%>;"> 
     28                <a class="cal-list-options-btn my-cal-list-options-btn-<%= signatures['taskGroup'][i].calendar.id %>" style="background-color:#<%=signatures['taskGroup'][i].backgroundColor%>; border-color:#<%= signatures['taskGroup'][i].borderColor%>;"> 
    2029                    <img src="../prototype/modules/calendar/img/arrow_down.png" width="10" height="10" class="cal-list-img"/> 
    2130                </a> 
    2231 
    2332 
    24                 <div class="cal-list-options my-cal-list-options-<%= signature[i].calendar.id %> hidden"> 
     33                <div class="cal-list-options my-cal-list-options-<%= signatures['taskGroup'][i].calendar.id %> hidden"> 
    2534                    <ul> 
    26                         <li><a href="#" onclick="add_tab_configure_calendar(<%= signature[i].calendar.id%>);">Configurações</a></li> 
    27                         <li><a href="#" onclick="show_modal_import_export(0, <%= signature[i].calendar.id%>);">Importar</a></li> 
    28                         <li><a href="#" onclick="show_modal_import_export(1, <%= signature[i].calendar.id%>);">Exportar</a></li> 
    29                         <li><a href="#" onclick="show_modal_shared(<%= signature[i].calendar.id%>);">Compartilhar agenda</a></li> 
    30                         <li><a href="#" onclick="remove_calendar();">Remover agenda</a></li> 
     35                        <li><a href="#" onclick="add_tab_configure_calendar(<%= signatures['taskGroup'][i].calendar.id%>, 1);">Configurações</a></li> 
     36                        <li><a href="#" onclick="show_modal_import_export(0,<%= signatures['taskGroup'][i].calendar.id%>, 1);">Importar</a></li> 
     37                        <li><a href="#" onclick="show_modal_import_export(1,<%= signatures['taskGroup'][i].calendar.id%>, 1);">Exportar</a></li> 
     38                        <%if(signatures['taskGroup'][i].type == '0'){%> 
     39                            <li><a href="#" onclick="remove_calendar(1);">Remover Grupo</a></li> 
     40                        <%}%> 
    3141                    </ul> 
    3242 
    3343                </div> 
    3444            </li> 
    35             <%           
    36             }else 
    37             external = true; 
    38             } 
    39             %> 
     45            <%}%> 
     46 
     47        </ul> 
     48    </div> 
     49 
     50    <div class="my-calendars"> 
     51        <a title='Minhas agendas' class="title-my-calendars" aria-expanded='false' role='button' tabindex='0'>Minhas agendas</a> 
     52        <span class="status-list ui-icon ui-icon-triangle-1-s"></span> 
     53        <a href="#" class="button new new-calendar 0">Nova Agenda</a> 
     54        <ul class="list-calendars my-list-calendars"> 
     55            <% for (var i=0; i < signatures.calendar.length; i++) {%> 
     56            <li class="list-calendars-item list-calendars-item-<%= signatures['calendar'][i].calendar.id %>" title="<%= signatures['calendar'][i].calendar.name %>"> 
     57 
     58                <div> 
     59                    <input class="calendar-view" type="checkbox" name="" value="<%= signatures['calendar'][i].calendar.id %>" checked="checked"/> 
     60                    <label><%= signatures['calendar'][i].calendar.name %></label> 
     61 
     62                </div>  
     63                <a class="cal-list-options-btn my-cal-list-options-btn-<%= signatures['calendar'][i].calendar.id %>" style="background-color:#<%=signatures['calendar'][i].backgroundColor%>; border-color:#<%= signatures['calendar'][i].borderColor%>;"> 
     64                    <img src="../prototype/modules/calendar/img/arrow_down.png" width="10" height="10" class="cal-list-img"/> 
     65                </a> 
     66 
     67 
     68                <div class="cal-list-options my-cal-list-options-<%= signatures['calendar'][i].calendar.id %> hidden"> 
     69                    <ul> 
     70                        <li><a href="#" onclick="add_tab_configure_calendar(<%= signatures['calendar'][i].calendar.id%>, 0);">Configurações</a></li> 
     71                        <li><a href="#" onclick="show_modal_import_export(0, <%= signatures['calendar'][i].calendar.id%>, 0);">Importar</a></li> 
     72                        <li><a href="#" onclick="show_modal_import_export(1, <%= signatures['calendar'][i].calendar.id%>, 0);">Exportar</a></li> 
     73                        <li><a href="#" onclick="show_modal_shared(<%= signatures['calendar'][i].calendar.id%>);">Compartilhar agenda</a></li> 
     74                        <li><a href="#" onclick="remove_calendar(0);">Remover agenda</a></li> 
     75                    </ul> 
     76 
     77                </div> 
     78            </li> 
     79            <%}%> 
    4080 
    4181        </ul> 
     
    4787        <a href="#" class="button new new-calendar-shared tiny">Nova Agenda</a> 
    4888 
    49         <% if (external) { %>    
    5089        <ul class="list-calendars signed-list-calendars"> 
    51             <% for (var i=0; i < signature.length; i++) { 
    52             if(signature[i].isOwner == 0){ 
    53             %> 
    54             <li class="list-calendars-item list-calendars-item-<%= signature[i].calendar.id %>" title="<%= signature[i].calendar.name %>"> 
     90            <% for (var i=0; i < signatures['sharedCalendar'].length; i++) {%> 
     91                <li class="list-calendars-item list-calendars-item-<%= signatures['sharedCalendar'][i].calendar.id %>" title="<%= signatures['sharedCalendar'][i].calendar.name %>"> 
    5592                 <div> 
    56                     <input class="calendar-view" type="checkbox" name="" value="<%= signature[i].calendar.id %>" checked="checked"/> 
    57                     <label><%= signature[i].calendar.name %></label> 
    58                  </div> 
    59                 <a class="cal-list-options-btn my-cal-list-options-btn-<%= signature[i].calendar.id %>" style="background-color:#<%=signature[i].backgroundColor%>; border-color:#<%= signature[i].borderColor%>;"> 
     93                            <input class="calendar-view" type="checkbox" name="" value="<%= signatures['sharedCalendar'][i].calendar.id %>" checked="checked"/> 
     94                            <label><%= signatures['sharedCalendar'][i].calendar.name %></label> 
     95                         </div> 
     96                <a class="cal-list-options-btn my-cal-list-options-btn-<%= signatures['sharedCalendar'][i].calendar.id %>" style="background-color:#<%=signatures['sharedCalendar'][i].backgroundColor%>; border-color:#<%= signatures['sharedCalendar'][i].borderColor%>;"> 
    6097                    <img src="../prototype/modules/calendar/img/arrow_down.png" width="10" height="10" class="cal-list-img"/></a> 
    61                 <div class="cal-list-options my-cal-list-options-<%= signature[i].calendar.id  %> hidden"> 
     98                <div class="cal-list-options my-cal-list-options-<%= signatures['sharedCalendar'][i].calendar.id  %> hidden"> 
    6299                    <ul> 
    63                         <li><a href="#" onclick="add_tab_configure_calendar(<%= signature[i].calendar.id %>);">Configurações</a></li> 
    64                         <li><a href="#" onclick="show_modal_import_export(0, <%= signature[i].calendar.id %>);">Importar</a></li> 
    65                         <li><a href="#" onclick="show_modal_import_export(1, <%= signature[i].calendar.id %>);">Exportar</a></li> 
    66                         <%if(!signature[i].permission.acl['required']){%> 
    67                             <li><a href="#" onclick="cancel_signature(<%= signature[i].id %>);">Cancelar assinatura</a></li> 
     100                        <li><a href="#" onclick="add_tab_configure_calendar(<%= signatures['sharedCalendar'][i].calendar.id %>, 0);">Configurações</a></li> 
     101                        <li><a href="#" onclick="show_modal_import_export(0, <%= signatures['sharedCalendar'][i].calendar.id%>, 0);">Importar</a></li> 
     102                        <li><a href="#" onclick="show_modal_import_export(1, <%= signatures['sharedCalendar'][i].calendar.id%>, 0);">Exportar</a></li> 
     103                        <%if(!signatures['sharedCalendar'][i].permission.acl['required']){%> 
     104                            <li><a href="#" onclick="cancel_signatures['sharedCalendar'](<%= signatures['sharedCalendar'][i].id %>);">Cancelar assinatura</a></li> 
    68105                        <%}%> 
    69106                    </ul> 
     
    72109 
    73110            </li> 
    74             <%           
    75             } 
    76             } 
    77             %> 
     111            <%}%> 
    78112        </ul> 
    79         <% } %> 
    80113    </div> 
    81114</div> 
  • trunk/prototype/modules/calendar/templates/configure_calendars.ejs

    r5341 r6996  
     1<%if(!!parseInt(data.type)){%> 
     2<div class="configure-calendars-win active" title="Configurações do Grupo de Tarefas"> 
     3        <h3>Preferências do Grupo de Tarefas</h3> 
     4<%}else{%> 
    15<div class="configure-calendars-win active" title="Configurações da Agenda"> 
    26        <h3>Preferências da Agenda</h3> 
     7<%}%> 
    38        <div  class="header-menu-container"> 
    49                <a class="button cancel" href="#">Cancelar</a> 
     
    611        </div> 
    712        <% for (var i=0; i<data.signatures.length; i++) { %> 
    8         <fieldset class="user-calendar" title="<%= data.calendars[i].name%>" > 
    9                 <legend><%= data.calendars[i].name%></legend> 
    10                  
    11         </fieldset> 
     13                <fieldset class="user-calendar" title="<%= data.calendars[i].name%>" > 
     14                        <legend><%= data.calendars[i].name%></legend> 
     15                </fieldset> 
    1216        <%} //for each signatures %> 
    1317<!--     
  • trunk/prototype/modules/calendar/templates/configure_calendars_itemlist.ejs

    r6498 r6996  
    1                 <%var isOwner = parseInt(data.signature.isOwner) ? '' : 'readonly="readonly"'%> 
     1                <%var isOwner = parseInt(data.signature.isOwner) ? '' : 'readonly="readonly"'; 
     2                var isGroup = !!parseInt(data.signature.calendar.type);%> 
    23                <form method="POST" action="calendarSignature:configure"> 
    34                        <input type="hidden" name="signature" value="<%=data.signature.id%>" /> 
     5                        <input type="hidden" name="type" value="<%=data.signature.calendar.type%>" /> 
    46                         
    57                        <fieldset class="configurations-basic"> 
     
    79 
    810                                <p class="input-group"> 
     11                                <%if(!isGroup){%>        
    912                                        <label for="name">Nome da agenda:</label> 
     13                                <%}else{%> 
     14                                        <label for="name">Nome do grupo:</label> 
     15                                <%}%> 
    1016                                        <input name="name" value="<%=data.calendar.name%>" <%= isOwner %> type="text" class=""/> 
    1117                                </p> 
     
    1521                                        <input name="description" value="<%=data.calendar.description%>" <%= isOwner %> type="text" class=""/> 
    1622                                </p> 
    17  
     23                        <%if(!isGroup){%>        
    1824                                <p class="input-group"> 
    1925                                        <label for="duration">Duração padrão de evento:</label> 
    2026                                        <input name="duration" value="<%=data.calendar.defaultDuration%>" <%= isOwner %> type="text" class="number"/> 
    2127                                </p> 
    22                                  
     28                        <%}%>    
    2329                                <p class="input-group"> 
     30                                <%if(!isGroup){%> 
    2431                                        <label for="timezone">Fuso horário da agenda:</label> 
    25                                         <%if(data.signature.isOwner == 0){%> 
     32                                <%}else{%> 
     33                                        <label for="timezone">Fuso horário do grupo:</label> 
     34                                <%} if(data.signature.isOwner == 0){%> 
    2635                                        <input name="timezone" value="<%=data.calendar.timezone%>" size="50" readonly="readonly" type="text" class=""/> 
    2736                                        <%}else{%> 
     
    2938                                        <%}%> 
    3039                                </p> 
    31  
     40                        <%if(!isGroup){%>                
    3241                                <p class="input-group"> 
    3342                                        <label for="location">URL:</label> 
    3443                                        <input name="location" value="<%=data.calendar.location%>" <%= isOwner %> type="text" class=""/> 
    3544                                </p> 
    36                                  
     45                        <%}%> 
    3746                        </fieldset>      
    3847 
    3948                        <fieldset class="configurations-colors"> 
     49                        <%if(!isGroup){%> 
    4050                                <legend class="">Cores dos eventos desta agenda</legend> 
    41  
     51                        <%} else{%>      
     52                                <legend class="">Cores das tarefas deste grupo</legend> 
     53                        <%}%> 
    4254                                <div class="calendar-colorpicker"></div> 
    4355                        </fieldset> 
     
    8698                                                        </select> 
    8799                                                        <input type="hidden" name="alarmId[]" value="<%=data.signature.defaultAlarms[i].id%>" /> 
     100                                                <%if(!isGroup){%> 
    88101                                                        <label>antes de cada evento.</label> 
     102                                                <%}else{%> 
     103                                                        <label>antes de cada tarefa.</label> 
     104                                                <%}%> 
    89105                                                        <a class="button remove tiny">Excluir</a> 
    90106                                                </li> 
  • trunk/prototype/modules/calendar/templates/event_add.ejs

    r6525 r6996  
    171171<div class="overflow_add_calender"> 
    172172        <fieldset id="calendar_addevent_details5" class="tab-level2"> 
    173         <form id="fileupload" action="attachment:detail" method="POST"> 
     173        <form id="fileuploadevent" action="attachment:detail" method="POST"> 
    174174        <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload --> 
    175175        <div class="row fileupload-buttonbar"> 
     
    183183                                <%}%> 
    184184                                <%if(data.event.acl.organization || data.event.acl.write){%> 
    185                                         <button type="button" class="button btn-danger delete"> 
     185                                        <button type="button" class="button btn-danger delete <%= data.event && data.event.attachments && data.event.attachments.length ? '' : 'hidden' %>"> 
    186186                                                <i class="icon-trash icon-white"></i> Remover Todos 
    187187                                        </button> 
    188188                                <%}%> 
    189189            </div> 
    190             <div id="fileupload-progress"></div> 
     190            <div id="fileupload-progress-event"></div> 
    191191            <div class="files-list"> 
    192192               <ul class="attachments-list"> 
  • trunk/prototype/modules/calendar/templates/event_list.ejs

    r6525 r6996  
    1 <div title="Lista de eventos" class="events-list events-list-win active"> 
     1<% 
     2 
     3    var decoder = {status: {1: 'Sem ações', 2: 'Em processo', 3: 'Completo', 4: 'Cancelado'}, priority: {1: 'Alta', 2: 'Normal', 3: 'Baixa'}} 
     4 
     5%> 
     6 
     7<div title="<%=data.tab_title%>" class="events-list events-list-win active"> 
    28         
    39         
     
    4349                                        <td> 
    4450                                                <span> 
     51                                                        <% 
     52                                                        var img_type = ""; 
     53                                                        var title_type = ""; 
     54                                                        if(_event.type == '1'){ 
     55                                                                img_type = "../prototype/modules/calendar/img/big-event.png"; 
     56                                                                title_type = "Evento"; 
     57                                                        }if(_event.type == '2'){ 
     58                                                                img_type = "../prototype/modules/calendar/img/big-task.png";  
     59                                                                title_type = "Tarefa"; 
     60                                                        }if(_event.type == '3'){ 
     61                                                                img_type = "../prototype/modules/calendar/img/activity_icon.jpg";  
     62                                                                title_type = "Atividade"; 
     63                                                        } 
     64                                                        %> 
     65                                                        <img title="<%= title_type %>" src="<%= img_type %>">  
    4566                                                        <a class="title event-details-item" title='<%= _event.summary %>' aria-expanded='false' role='button' tabindex='0'><%= _event.summary %></a> 
    4667                                                        <!-- TODO: FAZER FUNCIONAR DESTA FORMA --> 
     
    86107                                                        %> 
    87108                                                </span>  
    88                                                 <div class="details-event-list hidden"> 
     109                                                <div class="details-event-list hidden <%= (title_type == "Evento" ? "details-event" : "details-task")  %>"> 
    89110                                                        <fieldset class="fields-details-event-list">                                                     
    90111                                                                <%if(_event.allDay){%> 
    91112                                                                        <p class="input-group date-info"> 
    92                                                                                 <label>Duração</label> 
     113                                                                                <label>Duração:</label> 
    93114                                                                                <span class="">Dia inteiro</span> 
    94115                                                                        </p> 
     
    108129                                                                        </p> 
    109130                                                                <%}%> 
    110                                                                 <%if(_event.repeat ){%> 
     131                                                                <%if(_event.type == '1'){ 
     132                                                                        if(_event.repeat ){%> 
    111133                                                                    <p class="input-group"> 
    112134                                                                        <label>Repetição</label> 
    113135                                                                        <span><%= _event.repeat %></span> 
    114136                                                                    </p> 
    115                                                                 <%}%> 
    116                                                                 <p class="input-group"> 
    117                                                                         <label>Lembretes</label> 
    118                                                                         <% if(_event.alarms) { %> 
     137                                                                <%}}%> 
     138                                                                <p class="input-group"> 
     139                                                                        <label>Lembretes:</label> 
     140                                                                        <% if(_event.alarms) {  
     141                                                                                        var string_alarm = ""; 
     142                                                                                        if(_event.type == '1') 
     143                                                                                                string_alarm = 'do evento';  
     144                                                                                        if(_event.type == '2') 
     145                                                                                                string_alarm = 'da tarefa'; 
     146                                                                                        if(_event.type == '3') 
     147                                                                                                string_alarm = 'da atividade'; 
     148                                                                                        %> 
    119149                                                                                <span class="large" > 
    120150                                                                                        <% for (var l=0; l < _event.alarms.length; l++) { %> 
    121                                                                                                 <span class="large" >Você será notificado por um <%=dateCalendar.alarmtype[_event.alarms[l].type]%> <%= _event.alarms[l].time %> <%= dateCalendar.timeunit[_event.alarms[l].unit]%><%=_event.alarms[l].time > 1 ? 's' : '' %> antes do evento</span> 
     151                                                                                                <span class="large" >Você será notificado por um <%=dateCalendar.alarmtype[_event.alarms[l].type]%> <%= _event.alarms[l].time %> <%= dateCalendar.timeunit[_event.alarms[l].unit]%><%=_event.alarms[l].time > 1 ? 's' : '' %> antes <%=string_alarm%></span> 
    122152                                                                                        <% } %> 
    123153                                                                                </span> 
    124154                                                                        <% } %> 
    125155                                                                </p> 
    126                                                                 <p class="input-group"> 
    127                                                                         <label>Local</label> 
     156                                                                <%if(_event.type == '1'){%> 
     157                                                                <p class="input-group"> 
     158                                                                        <label>Local:</label> 
    128159                                                                        <span><%= _event.location %></span> 
    129160                                                                </p> 
    130                                                                 <p class="input-group"> 
    131                                                                         <label>Descrição </label> 
     161                                                                <%}%> 
     162                                                                <p class="input-group"> 
     163                                                                        <label>Descrição:</label> 
    132164                                                                        <span class="large" ><%= _event.description %></span> 
    133165                                                                </p> 
    134                                                                 <!--<p class="input-group"> 
     166                                                                <%if(_event.type != '1'){%> 
     167                                                                <p class="input-group"> 
     168                                                                        <label>Prioridade:</label> 
     169                                                                        <span><%= decoder['priority'][_event.priority] %></span> 
     170                                                                </p> 
     171                                                                <p class="input-group"> 
     172                                                                        <label>% Conlusão:</label> 
     173                                                                        <span><%= _event.percentage %>%</span> 
     174                                                                </p> 
     175                                                                <p class="input-group"> 
     176                                                                        <label>Status:</label> 
     177                                                                        <span><%= decoder['status'][_event.status] %></span> 
     178                                                                </p> 
     179                                                                <% } %> 
     180                                                                <!-- <p class="input-group"> 
    135181                                                                        <label>Privacidade</label> 
    136182                                                                        <span><%= _event.privacy %></span> 
    137                                                                 </p>--> 
    138                                                                 <p class="input-group"> 
    139                                                                         <label>Organizador</label> 
    140                                                                         <span class="large"><%= _event.organizer.user ? _event.organizer.user.name : _event.organizer.name %>  (<%= _event.organizer.user ? _event.organizer.user.mail : _event.organizer.mail %>)</span> 
    141                                                                 </p> 
    142                                                                 <p class="input-group"> 
    143                                                                         <label>Participantes</label> 
     183                                                                </p> --> 
     184                                                                <%if(_event.organizer && _event.organizer.user){%> 
     185                                                                <p class="input-group"> 
     186                                                                        <label>Organizador:</label> 
     187                                                                        <span class="large"><%= _event.organizer.user ? _event.organizer.user.name : _event.organizer.name %>  (<%= _event.organizer.user ? _event.organizer.user.mail : _event.organizer.mail %>)</span> 
     188                                                                </p> 
     189                                <%}%> 
     190                                                                <%if(_event.type != '3'){%> 
     191                                                                <p class="input-group"> 
     192                                                                        <label>Participantes:</label> 
    144193                                                                        <% if(_event.attendee) { %> 
    145194                                                                                <span class="large" > 
     
    150199                                                                        <% } %> 
    151200                                                                </p> 
    152                                                                 <p class="input-group"> 
    153                                                                         <label>Presença</label> 
     201                                                                <%} 
     202                                                                if(_event.type == '3'){%> 
     203                                                                <p class="input-group"> 
     204                                                                        <label>Tarefas</label> 
     205                                                                        <% if(_event.tasks) { %> 
     206                                                                                <span class="large" > 
     207                                                                                        <% for (var m in _event.tasks) { %> 
     208                                                                                                <span class="large"><%=_event.tasks[m].description%></span> 
     209                                                                                        <%}%> 
     210                                                                                </span> 
     211                                                                        <% } %> 
     212                                                                </p> 
     213                                                                <%}%> 
     214                                                                 
     215                                                                <p class="input-group"> 
     216                                                                        <label>Presença:</label> 
    154217                                                                        <span> 
    155                                                                             <% var status_name; 
    156                                                                                 if (_event.status == 1) 
    157                                                                                     status_name = "Eu vou"; 
    158                                                                                 else if (_event.status == 2) 
    159                                                                                     status_name = "Talvez"; 
    160                                                                                 else if (_event.status == 3) 
    161                                                                                     status_name = "Eu não vou"; 
    162                                                                             %> 
    163                                                                             <%= status_name %> 
    164                                                                         </span> <!-- Ta hardcodificado isso aqui? --> 
    165                                                                 </p> 
     218                                        <% var status_name; 
     219                                            if (_event.status == 1) 
     220                                                status_name = "Eu vou"; 
     221                                            else if (_event.status == 2) 
     222                                                status_name = "Talvez"; 
     223                                            else if (_event.status == 3) 
     224                                                status_name = "Eu não vou"; 
     225                                        %> 
     226                                        <%= status_name %> 
     227                                    </span> <!-- Ta hardcodificado isso aqui? --> 
     228                                                                </p> 
     229 
    166230                                                        </fieldset> 
    167231                                                        <div class="menu-container footer-container"> 
    168232                                                                <input name="eventid" type="hidden" value="<%=_event.id%>"></input> 
    169                                                                 <input name="calendarid" type="hidden" value="<%=_event.calendar%>"></input> 
     233                                                                <input name="eventtype" type="hidden" value="<%=_event.type%>"></input> 
     234                                <input name="calendarid" type="hidden" value="<%=_event.calendar ? _event.calendar : _event.group%>"></input> 
     235                                                                <a title="Imprimir" class="button print" href="#">Imprimir</a> 
    170236                                                                <a title="Excluir" class="button delete" href="#">Excluir</a> 
    171237                                                                <a title="Editar" class="button edit" href="#">Editar</a> 
  • trunk/prototype/modules/calendar/templates/import_export.ejs

    r5901 r6996  
    1515                <input type="hidden" name="type" value="iCal"> 
    1616                <input type="hidden" name="params[owner]" value="<%= data.owner %>"> 
    17                 <legend class="hidden">Importar agenda</legend> 
     17                <legend class="hidden">Importar <%=data.typeView == 0 ? 'eventos' : 'tarefas'%></legend> 
    1818                <p class="input-group"> 
    1919                        <label for="data">Arquivo:</label> 
     
    2121                        <input type="file" name="data" value=""/> 
    2222                        <span class="tip">Escolha o arquivo que contenha um ou vários eventos. A Agenda do Expresso pode importar informações de evento no formato iCal.</span> 
    23                         <label for="calendar">Agenda:</label> 
     23                        <label for="calendar"><%=data.typeView == 0 ? 'Agenda:' : 'Grupo:'%></label> 
    2424                        <select name="params[calendar]"> 
    2525                        <% for( var i = 0; i < data.calendars.length; i++ ){ %> 
     
    2727                        <% } %> 
    2828                        </select> 
    29                         <span class="tip">Agenda da qual os eventos serão importados</span> 
     29                        <span class="tip"><%=data.typeView == 0 ? 'Agenda da' : 'Grupo do'%> qual os eventos serão importados</span> 
    3030                </p> 
    3131        </fieldset> 
     
    4242                <legend class="hidden">Exportar agenda</legend> 
    4343                <p class="input-group"> 
    44                         <label for="calendar">Agenda:</label> 
     44                        <label for="calendar"><%=data.typeView == 0 ? 'Agenda:' : 'Grupo:'%></label> 
    4545                        <select name="calendar"> 
    4646                            <!--<option value="cal_all">Todas agendas</option>--> 
     
    4949                            <% } %> 
    5050                        </select> 
    51                         <span class="tip">Escolha a agenda que deseja exportar. A Agenda do Expresso pode exportar informações de evento no formato iCal.</span> 
     51                        <span class="tip">Escolha <%=data.typeView == 0 ? 'a agenda' : 'o grupo'%> que deseja exportar. <%=data.typeView == 0 ? 'A Agenda' : 'O Grupo'%> do Expresso pode exportar informações de <%=data.typeView == 0 ? 'eventos' : 'tarefas'%> no formato iCal.</span> 
    5252                </p> 
    5353        </fieldset> 
  • trunk/prototype/modules/calendar/templates/index.ejs

    r6525 r6996  
    2727<link rel="Stylesheet" type="text/css" href="<?= PLUGINSURL ?>/timepicker/jquery-ui-timepicker-addon.css" /> 
    2828<link rel="stylesheet" type="text/css" href='<?= PLUGINSURL ?>/zebradialog/css/zebra_dialog.css'></link> 
     29<link rel="stylesheet" type="text/css" href='<?= PLUGINSURL ?>/jquery.spinner/jquery.spinner.css'></link> 
    2930 
    3031<link rel="stylesheet" type="text/css" href="<?= MODULESURL ?>/css/layout.css" /> 
     
    7172<script type="text/javascript" src="<?= PLUGINSURL ?>/qtip/jquery.qtip-1.0.0-rc3.min.js"></script> 
    7273<script type="text/javascript" src="<?= PLUGINSURL ?>/contextmenu/jquery.contextMenu.js"></script> 
     74<script type='text/javascript' src='<?= PLUGINSURL ?>/jquery.spinner/jquery.spinner.min.js'></script> 
    7375 
    7476<!-- JPicker --> 
     
    8789 
    8890<script type='text/javascript' src='<?= MODULESURL ?>/js/map.disponibility.js'></script> 
     91 
     92<script type='text/javascript' src='<?= MODULESURL ?>/js/activity.helpers.js'></script> 
     93<script type='text/javascript' src='<?= MODULESURL ?>/js/task.helpers.js'></script> 
    8994<script type='text/javascript' src='<?= MODULESURL ?>/js/helpers.js'></script> 
    9095<script type='text/javascript' src='<?= MODULESURL ?>/js/calendar.shared.js'></script> 
     
    9297<script type='text/javascript' src='<?= MODULESURL ?>/js/calendar.codecs.js'></script> 
    9398<script type='text/javascript' src='<?= MODULESURL ?>/js/load.js'></script>      
     99<script type='text/javascript' src='<?= MODULESURL ?>/js/calendar.alarms.js'></script>   
    94100 
    95101<script type='text/javascript' src='<?= MODULESURL ?>/js/I18n.js'></script> 
     
    97103<script type="text/javascript" src="<?= MODULESURL ?>/js/init.js"></script> 
    98104<script type="text/javascript" src="<?= MODULESURL ?>/js/drag_area.js"></script> 
     105<script type="text/javascript" src="<?= MODULESURL ?>/js/desktop.notification.js"></script> 
    99106 
    100107</head> 
     
    107114                                <ul> 
    108115                                        <li><a href="#" onclick="add_tab_preferences();" class="menu-command configurations">Prefer&ecirc;ncias</a></li> 
    109                                         <li><a href="#" onclick="add_tab_configure_calendar();" class="menu-command configurations">Configura&ccedil;&atilde;o de agendas</a></li> 
     116                                        <li><a href="#" onclick="add_tab_configure_calendar(false, 0);" class="menu-command configurations">Configura&ccedil;&atilde;o de agendas</a></li> 
     117                                        <li><a href="#" onclick="add_tab_configure_calendar(false, 1);" class="menu-command configurations">Configura&ccedil;&atilde;o de grupos</a></li> 
    110118                                        <li><a href="#" onclick="show_modal_import_export(0);" class="menu-pass-through">Importar</a></li> 
    111119                                        <li><a href="#" onclick="show_modal_import_export(1);" class="menu-pass-through">Exportar</a></li> 
     
    120128                <div class="block-vertical-toolbox"> 
    121129                        <a class="button add add-event" href="#">Adicionar evento</a> 
     130                        <a class="button add add-task" href="#">Adicionar tarefa</a> 
     131                        <a class="button add add-activity" href="#">Adicionar atividade</a> 
    122132                        <!--<a class="button add" href="#" onclick="add_events_list();">Lista de Eventos</a>--> 
    123133                        <div class="mini-calendar"></div> 
     
    131141                        <ul> 
    132142                                <li><a href="#calendar">Agenda</a></li> 
    133                                 <li><a href="#tab_events_list_" onclick="add_events_list();">Lista de Eventos</a></li> 
     143                                <li><a href="#tab_events_list_" onclick="add_events_list(false, 0);">Lista de Eventos</a></li> 
     144                                <li><a href="#tab_tasks_list_" onclick="add_events_list(false, 1);">Lista de Tarefas</a></li> 
    134145                                <!--<li><a href="#sandbox2">Sandbox</a></li>--> 
    135146                        </ul> 
    136147                        <div id="calendar"> </div> 
    137148                        <div id="tab_events_list_"> </div> 
     149                        <div id="tab_tasks_list_"> </div> 
    138150                        <div id="sandbox2">     </div> 
    139151                        <div id="calendarShared">       </div> 
     
    147159        </div> 
    148160</body> 
    149  
    150161</html> 
    151  
  • trunk/prototype/modules/calendar/templates/participants_add_itemlist.ejs

    r6203 r6996  
    22        <div style="overflow:hidden; width:100%; display:table;"> 
    33                <div class="attendee-options"> 
    4                         <%if( !data[0].isDirty && (data[0].acl.organization || data[0].acl.write || data[0].acl.inviteGuests) ){%> 
     4                        <%if( !data[0].isDelegate && (!data[0].isDirty && data[0].notEvent) || (!data[0].isDirty && data[0].acl && (data[0].acl.organization || data[0].acl.write || data[0].acl.inviteGuests))){%> 
    55                                <a href="#" class="button delegate attendee-options-button-delegate new">Delegar participação a este participante</a> 
    66                        <%}%> 
    7                         <%if(data[0].acl.organization || data[0].acl.write){%> 
     7                        <%if(!data[0].noEvent && data[0].acl && (data[0].acl.organization || data[0].acl.write)){%> 
    88                                <a class="button edit attendee-options-button-edit new">Editar permissões</a> 
    99                        <%}%> 
     
    1414                <input type="hidden" name="attendee[]" value="<%= data[0].id %>"> 
    1515                <input type="hidden" name="attendeeType[]" value="<%=data[0].isExternal%>"> 
    16                 <input type="hidden" name="attendeeAcl[]" value="r"> 
     16                <%if(!data[0].noEvent){%> 
     17            <input type="hidden" name="attendeeAcl[]" value="r"> 
     18        <%}%> 
    1719                <input type="hidden" name="delegatedFrom[]" value="0"> 
    1820                <label title="<%= data[0].name ? data[0].name : '' %>" class="name"><%= data[0].name ? data[0].name : '' %></label> 
     
    2022 
    2123        </div> 
    22          
    2324</li> 
  • trunk/prototype/modules/calendar/templates/preferences_calendar.ejs

    r6921 r6996  
    7171                        </p> 
    7272 
     73                        <p class="input-group">  
     74                <label for="defaultCalendar">Agenda padrão:</label>  
     75                <select name="defaultCalendar" >  
     76                    <%for(var i = 0; i < data.calendars.length; i++){%>  
     77                        <option value="<%=data.calendars[i].id%>"> <%= data.calendars[i].name %></option>  
     78                    <%}%>  
     79                </select> 
     80                        </p> 
     81 
    7382                        <p class="input-group"> 
    74                                 <label for="defaultCalendar">Agenda padrão:</label> 
    75                                 <select name="defaultCalendar" > 
    76                                         <%for(var i = 0; i < data.calendars.length; i++){%> 
    77                                                 <option value="<%=data.calendars[i].id%>"> <%= data.calendars[i].name %></option> 
    78                                         <%}%> 
     83                                <label for="useDesktopNotification">Usar alarme desktop:</label> 
     84                                <select name="useDesktopNotification" > 
     85                                        <option value="1" <%= data.preferences.useDesktopNotification == '1' ? 'selected="selected"' : '' %>>Sim</option> 
     86                                        <option value="0" <%= data.preferences.useDesktopNotification != '1' ? 'selected="selected"' : '' %>>Não</option> 
    7987                                </select> 
    8088                        </p> 
  • trunk/prototype/modules/mail/css/followupflag.css

    r6724 r6996  
    231231.content-alarm ul { 
    232232        max-height: 100px; 
    233         overflow: auto; 
     233        overflow: hidden; 
    234234} 
    235235.content-alarm { 
  • trunk/prototype/modules/mail/js/followupflag.js

    r6922 r6996  
    178178         * #END: Implementação do widget de input-combobox 
    179179         */ 
     180         winElement.find('input[name="alarmDate"]').change(function(event){ 
     181                winElement.find('input[name="alarmTime"]').attr('disabled', ( $(this).val() == "" ? 'disabled' : false)); 
     182         }); 
     183 
     184         winElement.find('input[name="alarmDate"]').keyup(function(event){ 
     185                winElement.find('input[name="alarmTime"]').attr('disabled', ( $(this).val() == "" ? 'disabled' : false)).val(''); 
     186         }); 
    180187 
    181188        winElement.find('.button').button() 
     
    217224                                                        messageNumber : messageNumber, 
    218225                                                        isDone: isDone, 
     226                                                        isSent: 0, 
    219227                                                        backgroundColor : backgroundColor 
    220228                                                }, !!idFollowupflagged[i] ? {id: idFollowupflagged[i]} : {}); 
     
    414422        winElement.find('[name="alarm"]').click(function(){ 
    415423                if($(this).is(":checked")){ 
    416                         winElement.find('[name="alarmDate"],[name="alarmTime"]').removeAttr("disabled");                         
     424                        winElement.find('[name="alarmDate"]').removeAttr("disabled");                    
    417425                }else{ 
    418                         winElement.find('[name="alarmDate"],[name="alarmTime"]').attr("disabled","disabled"); 
     426                        winElement.find('[name="alarmDate"],[name="alarmTime"]').attr("disabled","disabled").val(''); 
    419427                } 
    420428        }); 
     429 
    421430        if(winElement.find('[name="alarm"]').is(":checked")){ 
    422431                winElement.find('[name="alarmDate"],[name="alarmTime"]').removeAttr("disabled"); 
    423432        } 
     433         
    424434        winElement.find('[name="done"]').click(function(){ 
    425435                if($(this).is(":checked")){ 
     
    492502 */ 
    493503function alarmFollowupflagged(alert_type, filter_list){ 
     504        var currentDate = new Date().toString("dd/MM/yyyy"); 
     505        var data = {alarmDeadline: false, doneDeadline: false, filtersAlarms: false}; 
     506 
    494507        switch(alert_type){ 
    495                 // carregar modais de sinalizadores 
    496508                case 'followupflagAlarms': 
    497509                        $('.doneDeadline').remove(); 
    498510                        $('.alarmDeadline').remove(); 
    499                         var toIterate = [ 
    500                                 { 
    501                                         attrDeadline: 'doneDeadline',  
    502                                         caption: {singular:'You have one undone message today:',  
    503                                         plural:"You have %1 undone messages today:" 
    504                                         }, 
    505                                         title: get_lang('Done'), 
    506                                         enable: ($.cookie("fadeCompleted") != (new Date).toString("dd/MM/yyyy")) 
    507                                 }, 
    508                                 { 
    509                                         attrDeadline: 'alarmDeadline', 
    510                                         caption: { 
    511                                                 singular:'You have a follow up due for today:',  
    512                                                 plural:'You have %1 follow ups due for today:' 
    513                                         }, 
    514                                         title: get_lang('Follow ups'), 
    515                                         enable: ($.cookie("fadeAlarm") != (new Date).toString("dd/MM/yyyy")) 
    516                                 } 
    517                         ]; 
    518                         break; 
    519                 // carregar modal de filtros 
     511                        data.alarmDeadline = $.cookie("fadeAlarm") != currentDate ? true : false; 
     512                        data.doneDeadline = $.cookie("fadeCompleted") != currentDate ? true : false; 
     513                break; 
    520514                case 'filtersAlarms': 
    521515                        $('.filtersDeadline').remove(); 
    522                         var toIterate = [ 
    523                                 { 
    524                                         attrDeadline: 'filtersDeadline', 
    525                                         caption: { 
    526                                                 singular:'You have an archived message:',  
    527                                                 plural:'You have %1 messages archived:' 
    528                                         }, 
    529                                         title: get_lang('Filter by sender'), 
    530                                         enable: ($.cookie("fadeFilterAlarm") != (new Date).toString("dd/MM/yyyy")) 
    531                                 } 
    532                         ]; 
    533                         break; 
    534                 // carregar todas as modais 
     516                        data.filtersAlarms = $.cookie("fadeFilterAlarm") != currentDate ? true : false; 
     517                break; 
    535518                default: 
    536519                        $('.gray').remove(); 
    537                         var toIterate = [ 
    538                                 { 
    539                                         attrDeadline: 'filtersDeadline', 
    540                                         caption: { 
    541                                                 singular:'You have an archived message:',  
    542                                                 plural:'You have %1 messages archived:' 
    543                                         }, 
    544                                         title: get_lang('Filter by sender'), 
    545                                         enable: ($.cookie("fadeFilterAlarm") != (new Date).toString("dd/MM/yyyy")) 
    546                                 }, 
    547                                 { 
    548                                         attrDeadline: 'doneDeadline',  
    549                                         caption: {singular:'You have one undone message today:',  
    550                                         plural:"You have %1 undone messages today:" 
    551                                         }, 
    552                                         title: get_lang('Done'), 
    553                                         enable: ($.cookie("fadeCompleted") != (new Date).toString("dd/MM/yyyy")) 
    554                                 },                               
    555                                 { 
    556                                         attrDeadline: 'alarmDeadline', 
    557                                         caption: { 
    558                                                 singular:'You have a follow up due for today:',  
    559                                                 plural:'You have %1 follow ups due for today:' 
    560                                         }, 
    561                                         title: get_lang('Follow ups'), 
    562                                         enable: ($.cookie("fadeAlarm") != (new Date).toString("dd/MM/yyyy")) 
     520                        data.alarmDeadline = $.cookie("fadeAlarm") != currentDate ? true : false; 
     521                        data.doneDeadline = $.cookie("fadeCompleted") != currentDate ? true : false; 
     522                        data.filtersAlarms = $.cookie("fadeFilterAlarm") != currentDate ? true : false; 
     523                break; 
     524        }; 
     525 
     526        var startDate = (new Date()).set({hour:0, minute:0, second:0}).toString('yyyy-MM-dd 00:00:00'); 
     527        var endDate = (new Date()).set({hour:0, minute:0, second:0}).addHours(24).toString('yyyy-MM-dd 00:00:00'); 
     528 
     529        if(data.alarmDeadline){ 
     530                var decodeAlarms = {'sent': [], 'task':[]};      
     531                alarms = DataLayer.get('followupflagged',  
     532                        { 
     533                                filter: ['AND', ['<', 'alarmDeadline', endDate], ['=','isSent','0'], ['=','isDone','0']],  
     534                                criteria: {deepness: 1} 
     535                        }); 
     536 
     537                if(alarms.length > 0){ 
     538                        var itens = []; 
     539                        for(var i = 0; i < alarms.length; i++){ 
     540 
     541                                var date = Date.parseExact(alarms[i]['alarmDeadline'], 'yyyy-MM-dd HH:mm:ss'); 
     542                        alarms[i]['alarmDeadline'] = date.toString('dd/MM HH:mm'); 
     543 
     544                                var nameFollowupflag = alarms[i]['followupflag']['id'] < 7 ? get_lang(alarms[i]['followupflag']['name']) : alarms[i]['followupflag']['name']; 
     545                                var li_alarm = alarms[i]['alarmDeadline'] + ' - ' + nameFollowupflag + ' - ' + alarms[i]['message']['headers']['subject']; 
     546 
     547                                if(alarms[i]['doneDeadline'] != ''){ 
     548                                        var dateDone = Date.parseExact(alarms[i]['doneDeadline'], 'yyyy-MM-dd HH:mm:ss'); 
     549                                        if(dateDone.getTime() < $.now()) 
     550                                                continue; 
    563551                                } 
    564                         ]; 
    565                         break; 
    566         } 
    567         var i = 0; 
    568         // recupera e monta os dados para serem exibidos nas modais de alarmes 
    569         while (it = toIterate.pop()){ 
    570                 if (!it.enable) continue; 
    571                  
    572                 var alarmInRange = {}; 
    573                 // caso for alarme de sinalizadores 
    574                 if(it.attrDeadline == 'doneDeadline' || it.attrDeadline == 'alarmDeadline'){ 
    575                         alarmInRange = DataLayer.get('followupflagged', {filter: ['AND', ['>', it.attrDeadline, (new Date()).set({hour:0, minute:0, second:0}).toString('yyyy-MM-dd 00:00:00')], ['<', it.attrDeadline, (new Date()).set({hour:0, minute:0, second:0}).addHours(24).toString('yyyy-MM-dd 00:00:00')]], criteria: {deepness: 1}}); 
    576                         if(alarmInRange.length > 0){ 
    577                                 for(var i=0; i<alarmInRange.length; i++){ 
    578                                         if(alarmInRange[i].isDone == 1){ 
    579                                                  alarmInRange.splice(i,1); 
    580                                                  i--; 
    581                                         } 
     552 
     553                                if(date.getTime() <= $.now()) 
     554                                        decodeAlarms.sent.push({ 
     555                                                "msg_number" : alarms[i]['messageNumber'], 
     556                                                "msg_folder" : alarms[i]['folderName'], 
     557                                                "a"                      : truncate(li_alarm, 34), 
     558                                                'id' : alarms[i].id 
     559                                        }); 
     560                        else 
     561                                decodeAlarms.task.push({ 
     562                                                a: truncate(li_alarm, 34), 
     563                                                sentTime:  date.getTime() / 1000, 
     564                                                id: alarms[i].id, 
     565                                                'msg_folder': alarms[i].folderName, 
     566                                                'msg_number': alarms[i].messageNumber 
     567                                        }); 
     568                        } 
     569 
     570                        if(decodeAlarms.task.length) 
     571                                alarmDeadline.load(decodeAlarms.task); 
     572 
     573                        if(decodeAlarms.sent.length) 
     574                                data.alarmDeadline = { 
     575                                                alarms: decodeAlarms.sent, 
     576                                                title: get_lang('Follow ups'), 
     577                                                caption: (itens.length == 1) ? get_lang('You have one undone message today:') : get_lang('You have %1 follow ups due for today:', decodeAlarms.sent.length), 
     578                                                type: 'alarmDeadline' 
     579                                        }; 
     580                        else 
     581                                data.alarmDeadline = false; 
     582                }else 
     583                        data.alarmDeadline = false; 
     584        } 
     585 
     586        if(data.doneDeadline){ 
     587                alarms = DataLayer.get('followupflagged', {filter: ['AND', ['>', 'doneDeadline', startDate], ['<', 'doneDeadline', endDate]], criteria: {deepness: 1}}); 
     588 
     589                if(alarms.length > 0){ 
     590                        var itens = []; 
     591                        for(var i = 0; i < alarms.length; i++){ 
     592 
     593                            var date = Date.parseExact(alarms[i]['doneDeadline'], 'yyyy-MM-dd HH:mm:ss'); 
     594                            alarms[i]['doneDeadline'] = date.toString('dd/MM HH:mm'); 
     595 
     596                            var nameFollowupflag = alarms[i]['followupflag']['id'] < 7 ? get_lang(alarms[i]['followupflag']['name']) : alarms[i]['followupflag']['name']; 
     597                            var li_alarm = alarms[i]['doneDeadline'] + ' - ' + nameFollowupflag + ' - ' + truncate(alarms[i]['message']['headers']['subject'], 15); 
     598 
     599                            itens.push({ 
     600                                    a: truncate(li_alarm, 34), 
     601                                    id: alarms[i].id, 
     602                                    'msg_folder': alarms[i].folderName, 
     603                                    'msg_number': alarms[i].messageNumber 
     604                            }); 
     605                        } 
     606                    data.doneDeadline = { 
     607                        alarms: itens, 
     608                        title: get_lang('Done'), 
     609                        caption: (itens.length == 1) ? get_lang('You have one undone message today:') : get_lang('You have %1 follow ups due for today:', itens.length), 
     610                        type: 'doneDeadline' 
     611                    }; 
     612                }else 
     613                    data.doneDeadline = false; 
     614        } 
     615 
     616        if(data.filtersAlarms){ 
     617 
     618                alarms = filter_list; 
     619 
     620                if(alarms.length > 0){ 
     621                    var itens = []; 
     622 
     623                    for(var i=0; i<alarms.length; i++){ 
     624                        alarms[i]['udate'] =  new Date(alarms[i]['udate']*1000).toString('dd/MM HH:mm'); 
     625                        var li_alarm = alarms[i]['udate'] + ' - ' + alarms[i]['from'] + ' - ' + alarms[i]['subject']; 
     626 
     627                        itens.push({ 
     628                                'msg_number' : alarms[i]['msg_number'], 
     629                                'msg_folder' : alarms[i]['msg_folder'], 
     630                                a            : truncate(html_entities(li_alarm), 34), 
     631                                id : alarms[i].id 
     632                        });                              
     633                } 
     634 
     635                data.filtersAlarms = { 
     636                                alarms: itens, 
     637                                title: get_lang('Filter by sender'), 
     638                                caption: (itens.length == 1) ? get_lang('You have an archived message:') : get_lang('You have %1 messages archived:', itens.length), 
     639                                type: 'filtersDeadline', 
     640                                captions: { 
     641                                    singular:'You have one undone message today:',  
     642                                    plural:"You have %1 undone messages today:" 
    582643                                } 
    583                         } 
    584                          
    585                         if(alarmInRange.length > 0){ 
    586                                 var messages_alarm = []; 
    587                                 for(var i=0; i<alarmInRange.length; i++){ 
    588                                         var date = Date.parseExact(alarmInRange[i][it.attrDeadline], 'yyyy-MM-dd HH:mm:ss'); 
    589                                         if(date) 
    590                                                 alarmInRange[i][it.attrDeadline] = date.toString('HH:mm'); 
    591                                          
    592                                         if(alarmInRange[i]['followupflag']['id'] < 7){ 
    593                                                 var nameFollowupflag = get_lang(alarmInRange[i]['followupflag']['name']); 
    594                                         }else{ 
    595                                                 var nameFollowupflag = alarmInRange[i]['followupflag']['name']; 
    596                                         } 
    597                                         var li_alarm = alarmInRange[i][it.attrDeadline] + ' - ' + nameFollowupflag + ' - ' + truncate(alarmInRange[i]['message']['headers']['subject'], 15); 
    598                                         messages_alarm.push({ 
    599                                                 "msg_number" : alarmInRange[i]['messageNumber'], 
    600                                                 "msg_folder" : alarmInRange[i]['folderName'], 
    601                                                 "a"                      : li_alarm 
    602                                         });                              
    603                                 } 
    604                         } 
    605                 }  
    606                 // caso for alarme de filtros 
    607                 else if(filter_list){ 
    608                         alarmInRange = filter_list; 
    609                         if(alarmInRange.length > 0){ 
    610                                 var messages_alarm = []; 
    611                                 for(var i=0; i<alarmInRange.length; i++){ 
    612                                          
    613                                         alarmInRange[i]['udate'] =  new Date(alarmInRange[i]['udate']*1000).toString('dd/MM/yyyy HH:mm'); 
    614                                                  
    615                                         var li_alarm = alarmInRange[i]['udate'] + ' - ' + alarmInRange[i]['from'] + ' - ' + truncate(alarmInRange[i]['subject'], 15); 
    616                                         messages_alarm.push({ 
    617                                                 "msg_number" : alarmInRange[i]['msg_number'], 
    618                                                 "msg_folder" : alarmInRange[i]['msg_folder'], 
    619                                                 "a"                      : li_alarm 
    620                                         });                              
    621                                 } 
    622                         } 
    623                 } 
    624                                  
    625                 if(alarmInRange.length > 0){ 
    626                         // monta o subtitulo da modal 
    627                         var caption = (alarmInRange.length == 1) ? 
    628                                 get_lang(it.caption.singular): 
    629                                 get_lang(it.caption.plural, alarmInRange.length); 
    630                         // monta o array de dados a ser passado para o template  
    631                         var data = { 
    632                                 alarmInRange : messages_alarm,  
    633                                 caption: caption,  
    634                                 type: it.attrDeadline, 
    635                                 captions: it.caption 
    636644                        }; 
    637                         // tipo de modal a ser exibida 
    638                         var type_alarm = it.attrDeadline; 
    639                         //função chamada ao clicar no botão Ok da modal 
    640                         var ok_function = function(event, type, type_cookie){ 
    641                                 if($(event.target).parents('.'+type).find('[name="stopAlert"]').is(':checked')){ 
    642                                         $.cookie(type_cookie, (new Date).toString("dd/MM/yyyy"), {  
    643                                                 expires: 1  
    644                                         }); 
    645                                 } 
    646                         } 
    647                         // carrega o template dos alarmes e cria a modal utilizando o plugin freeow 
    648                         var dialogText = DataLayer.render("../prototype/modules/mail/templates/followupflag_alarm_list.ejs", data); 
    649                         var titulo = '<div class="header-alarm"><span class="img_title"></span><span class="title-alarm"><strong>'+it.title+'</strong></span><span name="header-icon" class="maximize-alarm"></span></div>'; 
    650                         $("#freeow").freeow(titulo, dialogText, { 
    651                                 classes: ["gray", type_alarm], 
    652                                 autoHide: false,  
    653                                 startStyle: null, 
    654                                 onClick: function(event){ 
    655                                         var type = ''; 
    656                                         var type_cookie = ''; 
    657                                         if($(this).hasClass('alarmDeadline')){ 
    658                                                 type = 'alarmDeadline'; 
    659                                                 type_cookie = 'fadeAlarm'; 
    660                                         }else if($(this).hasClass('doneDeadline')){ 
    661                                                 type = 'doneDeadline'; 
    662                                                 type_cookie = 'fadeCompleted'; 
    663                                         }else if($(this).hasClass('filtersDeadline')){ 
    664                                                 type = 'filtersDeadline'; 
    665                                                 type_cookie = 'fadeFilterAlarm'; 
    666                                         } 
    667                                         if($(event.target).hasClass('stop-alert-alarm')){ 
    668                                                 return; 
    669                                         } 
    670                                         if($(event.target).hasClass('minimize-alarm')){ 
    671                                                 $('.'+type).find('.content-alarm').hide(); 
    672                                                 $(event.target).removeClass('minimize-alarm').addClass('maximize-alarm'); 
    673                                                 return; 
    674                                         } 
    675                                         if($(event.target).hasClass('maximize-alarm')){ 
    676                                                 $('.'+type).find('.content-alarm').show(); 
    677                                                 $(event.target).removeClass('maximize-alarm').addClass('minimize-alarm'); 
    678                                                 return; 
    679                                         } 
    680                                         if($(event.target).hasClass('confirm-alarm')){ 
    681                                                 ok_function(event, type, type_cookie); 
    682                                                 $('.'+type).remove(); 
    683                                                 return; 
    684                                         } 
    685                                         return false; 
    686                                 } 
    687                         }); 
    688                         // elementos do freeow desnecessários 
    689                         $('.gray .background .content p').remove(); 
    690                         $('.gray .icon').remove(); 
    691                         $('.gray .close').remove(); 
    692                          
    693                         // botão ok da modal com jquery button 
    694                         $('.content-alarm button').button(); 
    695                 }                
    696         } 
    697          
     645 
     646                }else 
     647                    data.filtersAlarms = false; 
     648        } 
     649 
     650        for (var i in data) 
     651                if(data[i] != false) 
     652                        showAlarmsModal(data[i]); 
     653 
    698654        // controle de qual janela de alarme estará maximizada 
    699655        $('.gray').find('.content-alarm').hide(); 
     
    712668                } 
    713669        } 
    714          
     670} 
     671 
     672function showAlarmsModal(alarm){ 
     673         
     674        var ok_function = function(event, type, type_cookie){ 
     675                if($(event.target).parents('.'+type).find('[name="stopAlert"]').is(':checked')){ 
     676                        $.cookie(type_cookie, (new Date).toString("dd/MM/yyyy"), {  
     677                                expires: 1  
     678                        }); 
     679                } 
     680        } 
     681 
     682        // carrega o template dos alarmes e cria a modal utilizando o plugin freeow 
     683        var dialogText = DataLayer.render("../prototype/modules/mail/templates/followupflag_alarm_list.ejs", alarm); 
     684        var titulo = '<div class="header-alarm"><span class="img_title"></span><span class="title-alarm"><strong>'+alarm.title+'</strong></span><span name="header-icon" class="maximize-alarm"></span></div>'; 
     685         
     686        $("#freeow").freeow(titulo, dialogText, { 
     687                classes: ["gray", alarm.type], 
     688                autoHide: false,  
     689                startStyle: null, 
     690                onClick: function(event){ 
     691                        var type = ''; 
     692                        var type_cookie = ''; 
     693                        if($(this).hasClass('alarmDeadline')){ 
     694                                type = 'alarmDeadline'; 
     695                                type_cookie = 'fadeAlarm'; 
     696                        }else if($(this).hasClass('doneDeadline')){ 
     697                                type = 'doneDeadline'; 
     698                                type_cookie = 'fadeCompleted'; 
     699                        }else if($(this).hasClass('filtersDeadline')){ 
     700                                type = 'filtersDeadline'; 
     701                                type_cookie = 'fadeFilterAlarm'; 
     702                        } 
     703                        if($(event.target).hasClass('stop-alert-alarm')){ 
     704                                return; 
     705                        } 
     706                        if($(event.target).hasClass('minimize-alarm')){ 
     707                                $('.'+type).find('.content-alarm').hide(); 
     708                                $(event.target).removeClass('minimize-alarm').addClass('maximize-alarm'); 
     709                                return; 
     710                        } 
     711                        if($(event.target).hasClass('maximize-alarm')){ 
     712                                $('.'+type).find('.content-alarm').show(); 
     713                                $(event.target).removeClass('maximize-alarm').addClass('minimize-alarm'); 
     714                                return; 
     715                        } 
     716                        if($(event.target.parentElement).hasClass('confirm-alarm')){ 
     717                                ok_function(event, type, type_cookie); 
     718                                $('.'+type).remove(); 
     719                                return; 
     720                        } 
     721                        return false; 
     722                } 
     723        }); 
     724        // elementos do freeow desnecessários 
     725        $('.gray .background .content p').remove(); 
     726        $('.gray .icon').remove(); 
     727        $('.gray .close').remove(); 
     728 
     729        $('div.gray.alarmDeadline .button.delete').button({ 
     730                text: false, 
     731                icons:{ 
     732                        primary: 'ui-icon-close' 
     733                } 
     734        }) 
     735         
     736        // botão ok da modal com jquery button 
     737        $('.content-alarm button').button(); 
     738} 
     739 
     740function cancelAlarm(element, idAlarm, messageNumber, folderName){ 
     741 
     742        $(element).parents('li').remove(); 
     743 
     744        var view = 'div.gray.alarmDeadline'; 
     745        var length = $(view).find('ul.message-list li').length; 
     746 
     747        if(length > 0){ 
     748                var msg = ''; 
     749                if(length == 1) 
     750                        msg = get_lang( 'You have a follow up due for today:'); 
     751                else 
     752                        msg = get_lang('You have %1 follow ups due for today:', length); 
     753 
     754                $(view).find('span.subtitle-alarm strong').html(msg); 
     755        }else 
     756                $(view).remove(); 
     757 
     758        DataLayer.put('followupflagged',  
     759                { 
     760                        id: idAlarm ,  
     761                        isSent: '1', 
     762                        folderName: folderName, 
     763                        messageNumber: messageNumber, 
     764                        uid: User.me.uid 
     765                }); 
     766 
     767        DataLayer.commit(); 
     768 
     769} 
     770 
     771alarmDeadline = { 
     772 
     773 
     774        load: function(alarm){ 
     775                var currentDate = new Date().toString("dd/MM/yyyy") 
     776                if($.cookie("fadeAlarm") != currentDate) 
     777                        for(var i = 0; i < alarm.length; i++) 
     778                                this.addAlarm( alarm[i] ); 
     779        }, 
     780 
     781        addAlarm: function(alarm){ 
     782 
     783                    DataLayer.task( parseInt(alarm['sentTime']) , function( timestamp ){ 
     784                        var view = 'div.gray.alarmDeadline'; 
     785 
     786                        if(!$(view+' li.message-item.'+alarm.id).length){ 
     787 
     788                                var currentDate = new Date().toString("dd/MM/yyyy") 
     789                                        if($.cookie("fadeAlarm") != currentDate) 
     790                                         
     791                                        if($('div.gray.alarmDeadline').length){ 
     792                                                 
     793                                                $(view).find('ul.message-list').append(DataLayer.render("../prototype/modules/mail/templates/followupflag_alarmDeadline_add_item_list.ejs", alarm)) 
     794 
     795                                                var length = $(view).find('ul.message-list li').length; 
     796                                                var msg = ''; 
     797                                                if(length == 1) 
     798                                                        msg = get_lang( 'You have a follow up due for today:'); 
     799                                                else 
     800                                                        msg = get_lang('You have %1 follow ups due for today:', length); 
     801 
     802                                                $(view).find('span.subtitle-alarm strong').html(msg); 
     803 
     804                                                $(view+' .button.delete').button({ 
     805                                                                text: false, 
     806                                                                icons:{ 
     807                                                                        primary: 'ui-icon-close' 
     808                                                                } 
     809                                                        }); 
     810 
     811                                        }else{ 
     812                                                var item = { 
     813                                                                alarms: [alarm], 
     814                                                                title: get_lang('Follow ups'), 
     815                                                                caption: get_lang('You have one undone message today:'), 
     816                                                                type: 'alarmDeadline' 
     817                                                        }; 
     818                                                        showAlarmsModal(item); 
     819                                        } 
     820                                    } 
     821                                 
     822                    }); 
     823        } 
     824 
    715825} 
    716826                 
  • trunk/prototype/modules/mail/templates/followupflag_alarm_list.ejs

    r6487 r6996  
    33                <strong><%=data.caption %></strong> 
    44        </span> 
    5         <ul class="message-list"> 
     5        <ul class="message-list" style="float: left;"> 
    66        <% 
    7         for(var i=0; i<data.alarmInRange.length; i++){ 
     7        for(var i=0; i<data.alarms.length; i++){ 
    88                if(data.type == 'filtersDeadline') 
    9                         var openMessageScript = "$(this).parent().remove(); var msgs_count = $('.filtersDeadline').find('.message-item').length; if(msgs_count == 0){ $('.filtersDeadline').remove(); } $('.subtitle-alarm').find('strong').html((msgs_count == 1)?get_lang('"+data.captions.singular+"'):get_lang('"+data.captions.plural+"', msgs_count)); cExecute('$this.imap_functions.open_flagged_msg&msg_number="+data.alarmInRange[i].msg_number+"&msg_folder="+data.alarmInRange[i].msg_folder+"&alarm=true', show_msg);"; 
     9                        var openMessageScript = "$(this).parent().remove(); var msgs_count = $('.filtersDeadline').find('li.message-item').length; if(msgs_count == 0){ $('.filtersDeadline').remove(); } $('.subtitle-alarm').find('strong').html((msgs_count == 1)?get_lang('"+data.captions.singular+"'):get_lang('"+data.captions.plural+"', msgs_count)); cExecute('$this.imap_functions.open_flagged_msg&msg_number="+data.alarms[i].msg_number+"&msg_folder="+data.alarms[i].msg_folder+"&alarm=true', show_msg);"; 
    1010                else     
    11                         var openMessageScript = "cExecute('$this.imap_functions.get_info_msg&msg_number="+data.alarmInRange[i].msg_number+"&msg_folder="+data.alarmInRange[i].msg_folder+"&alarm=true', show_msg);"; 
     11                        var openMessageScript = "cExecute('$this.imap_functions.get_info_msg&msg_number="+data.alarms[i].msg_number+"&msg_folder="+data.alarms[i].msg_folder+"&alarm=true', show_msg);"; 
    1212        %> 
    13                 <li class="message-item"> 
     13                <li class="message-item <%= data.alarms[i].id %>"> 
    1414                        <a onclick="<%=openMessageScript%>"> 
    15                                 <%= data.alarmInRange[i].a %> 
     15                                <%= data.alarms[i].a %> 
    1616                        </a> 
     17                        <%if( data.type == 'alarmDeadline'){%> 
     18                                <a onclick='cancelAlarm(this, "<%= data.alarms[i].id %>", "<%= data.alarms[i].msg_number %>", "<%= data.alarms[i].msg_folder %>");' class="tiny button delete">close</a> 
     19                        <%}%> 
    1720                </li> 
    1821        <% 
  • trunk/prototype/modules/mail/templates/followupflag_configure.ejs

    r6294 r6996  
    7070                                <input type="checkbox" name="alarm" <%=(followupflagged.alarmDeadline) ? 'checked="checked"' : '' %> /><label><%= get_lang("Alarm")%>: </label> 
    7171                                <input type="text" name="alarmDate" class="date" size="12" value="<%=(followupflagged.alarmDeadline) ? followupflagged.alarmDeadline.toString('dd/MM/yyyy') : '' %>" />  
    72                                 <input type="hidden" name="alarmTime" class="time" size="8" value="00:01" /> 
     72                                <input type="text" name="alarmTime" class="time" size="8" disabled="disabled" value="<%=(followupflagged.alarmDeadline) ? followupflagged.alarmDeadline.toString('HH:mm') : '' %>" /> 
    7373                        </div>           
    7474                   <div class="completed-followup"> 
  • trunk/prototype/services/iCal.php

    r6861 r6996  
    197197                        default: 
    198198                            break; 
    199                     } 
    200                 }        
     199                         
     200        case TASK_ID: 
     201 
     202            $todo = $ical->newComponent('todo'); 
     203 
     204            $todo->setProperty('summary', $v['summary']); 
     205            $todo->setProperty('description', isset($v['description']) ? $v['description'] : ''); 
     206            $todo->setProperty('priority', $v['priority']); 
     207            $todo->setProperty('percent-complete', $v['percentage']); 
     208            $todo->setProperty('status', $this->_getStatusTodo($v['status'])); 
     209 
     210            $timezone = new DateTimeZone('UTC'); 
     211            $apTimezone = self::nomalizeTZID(( isset($v['timezone']) && $v['timezone'] != 'null' ) ? $v['timezone'] : $params['defaultTZI']); 
     212            $apTimezoneOBJ = new DateTimeZone($apTimezone); 
     213 
     214            $sTime = new DateTime('@' . (int) ($v['startTime'] / 1000), $timezone); 
     215            $sTime->setTimezone($apTimezoneOBJ); 
     216            $eTime = new DateTime('@' . (int) ($v['endTime'] / 1000), $timezone); 
     217            $eTime->setTimezone($apTimezoneOBJ); 
     218 
     219            if (isset($v['allDay']) && $v['allDay'] == 1) { 
     220                $todo->setProperty('dtstart', $sTime->format(DATE_RFC822), array("VALUE" => "DATE")); 
     221                $todo->setProperty('dtend', $eTime->format(DATE_RFC822), array("VALUE" => "DATE")); 
     222                //$todo->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'TRUE'); 
     223            } else { 
     224                $todo->setProperty('dtstart', $sTime->format(DATE_RFC822), array('TZID' => $apTimezone)); 
     225                $todo->setProperty('dtend', $eTime->format(DATE_RFC822), array('TZID' => $apTimezone)); 
     226                //$todo->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'FALSE'); 
     227            } 
     228 
     229            if(isset($v['due']) && $v['due'] != ''){ 
     230                $dueTime = new DateTime('@' . (int) ($v['due'] / 1000), $timezone); 
     231                $dueTime->setTimezone($apTimezoneOBJ); 
     232 
     233                $todo->setProperty('due', $dueTime->format(DATE_RFC822), array('TZID' => $apTimezone)); 
     234            } 
     235             
     236            $todo->setProperty('due', $dueTime->format(DATE_RFC822), array('TZID' => $apTimezone)); 
     237                    
     238            if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0) 
     239                $participants = $v['participants']; 
     240            else 
     241                $participants = Controller::find(array('concept' => 'participant'), false, array('filter' => array('=', 'schedulable', $v['id']))); 
     242             
     243            if (is_array($participants) && count($participants) > 0) 
     244                foreach ($participants as $ii => $vv) { 
     245                 
     246                    if(isset($participants[$ii]['user']) && !is_array($participants[$ii]['user'])) 
     247                    { 
     248                        if ($vv['isExternal'] == 1) 
     249                            $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'], 'service' => 'PostgreSQL')); 
     250                        else 
     251                            $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'])); 
     252                    } 
     253                 
     254                    if ($participants[$ii]['user']['id'] == Config::me('uidNumber')) 
     255                    { 
     256                        $alarms = (isset($participants[$ii]['alarms'])) ? $participants[$ii]['alarms'] : Controller::find(array('concept' => 'alarm'), null, array('filter' => array('AND', array('=', 'participant', $vv['id']), array('=', 'schedulable', $v['id'])))); 
     257                        if(is_array($alarms)) 
     258                            self::createAlarms($alarms, $todo); 
     259                    } 
     260                 
     261                } 
     262 
     263            if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0) 
     264                $this->createAttendee($v['participants'], $todo); 
     265 
     266            if (isset($v['attachments']) && is_array($v['attachments']) && count($v['attachments']) > 0) 
     267                $this->createAttachment($v['attachments'], $todo); 
     268 
     269            $todo->setProperty('uid', $v['uid']);   
     270             
     271            break; 
     272 
     273                default: 
     274                    break; 
     275            } 
     276        } 
    201277 
    202278         
    203                 return $ical->createCalendar(); 
     279        return $ical->createCalendar(); 
    204280    } 
    205281 
     
    624700                            else // Importar evento 
    625701                                $interation = self::_makeVEVENT(array(), $component, $params); 
    626  
    627  
    628  
    629702                            break; 
    630703                    } 
     
    633706                    $return[] = $interation; 
    634707                    break; 
    635                 case 'VTIMEZONE': 
    636  
    637  
    638                     break; 
     708        /***********************************************************************TODO*******************************************************************************/ 
     709        case 'VTODO': 
     710        switch ($method) { 
     711            case 'PUBLISH': 
     712                //Caso a tarefa não exista o mesmo cria um novo evento, se já existir o mesmo referencia o evento com agenda 
     713                if (!$schedulable = self::_getSchedulable($uid)) 
     714                    $interation = self::_makeVTODO($schedulable, $component, $params); 
     715                else{ 
     716                    $links = Controller::read(array('concept' => 'calendarToSchedulable'), array('id'), array('filter' => 
     717                    array('AND', 
     718                        array('=', 'calendar', $params['calendar']), 
     719                        array('=', 'schedulable', $schedulable['id']) 
     720                    ))); 
     721 
     722                    if(!$links &&  !isset($links[0])) 
     723                        Controller::create(array('concept' => 'calendarToSchedulable'), array('calendar' => $params['calendar'], 'schedulable' => $schedulable['id'])); 
     724                } 
     725                break; 
     726 
     727            case 'REQUEST': 
     728                $schedulable = self::_getSchedulable($uid); 
     729 
     730                if ($schedulable) { //Caso tarefa exista 
     731                    if (!self::_existInMyCalendars($schedulable['id'], $params['owner'])) { 
     732                         
     733                        $calendarToSchedulable = array(); 
     734                        $calendarToSchedulable['calendar'] = $params['calendar']; 
     735                        $calendarToSchedulable['schedulable'] = $schedulable['id']; 
     736                        $interation['calendarToSchedulable://' . mt_rand() . '(Formatter)'] = $calendarToSchedulable; 
     737         
     738                        if (isset($params['status'])) { 
     739                            if($params['owner'] != Config::me("uidNumber")){                         
     740                                $user = Controller::Read(array('concept' => 'user'), false, array('filter' => array('=', 'id', $params['owner'])) );                         
     741                                $pID = self::_getParticipantByMail($user[0]['mail'], $schedulable['participants']); 
     742                            }else 
     743                                $pID = self::_getParticipantByMail(Config::me('mail'), $schedulable['participants']); 
     744                                $interation['participant://' . $pID]['status'] = $params['status']; 
     745                        } 
     746                        Config::regSet('noAlarm', FALSE); //reativa notificação 
     747                    } else { 
     748 
     749                        if (self::_getTime($component, 'dtstamp') > $schedulable['dtstamp'] || $component->getProperty('sequence', false, false) > $schedulable['sequence']) //Organizador esta requisitando que você atualize o evento 
     750                            $interation = self::_makeVEVENT($schedulable, $component, $params); 
     751                        else if ($component->getProperty('sequence', false, false) === $schedulable['sequence']) { 
     752                        //Ler melhor rfc sobre isto 3.2.2.2 
     753                        //Aparentemente é para retornar um ical com o evento atualizado para o attende 
     754                        } 
     755 
     756                        if (isset($params['status'])) { 
     757                            if($params['owner'] != Config::me("uidNumber")){                         
     758                               $user = Controller::Read(array('concept' => 'user'), false, array('filter' => array('=', 'id', $params['owner'])) );                      
     759                                $pID = self::_getParticipantByMail($user[0]['mail'], $schedulable['participants']); 
     760                            }else 
     761                                $pID = self::_getParticipantByMail(Config::me('mail'), $schedulable['participants']); 
     762                            //Verifica a importação de eventos em que não participo 
     763                            if ($pID) { 
     764                                $interation['participant://' . $pID]['status'] = $params['status']; 
     765                            } 
     766                        } 
     767                    } 
     768                } else { // Importar tarefa 
     769                    $interation = self::_makeVEVENT(array(), $component, $params); 
     770 
     771                    if (strpos($params['prodid'], 'kigkonsult.se') !== false) { //envia notificação para fora 
     772 
     773                        /* Data de Inicio */ 
     774                        $startTime = $component->getProperty('dtstart', false, true); 
     775                        $tzid = isset($startTime['params']['TZID']) ? $startTime['params']['TZID'] : $params['X-WR-TIMEZONE']; 
     776 
     777                        /* Tiem zone do evento */    
     778                        if ($tzid) 
     779                            $sc['timezone'] = self::nomalizeTZID($tzid); 
     780                        else 
     781                            $sc['timezone'] = isset($params['calendar_timezone']) ? $params['calendar_timezone'] : 'America/Sao_Paulo'; 
     782 
     783                        $objTimezone = new DateTimeZone($sc['timezone']); 
     784 
     785                        if (isset($startTime['params']['VALUE']) && $startTime['params']['VALUE'] === 'DATE' && isset($params['calendar_timezone'])) { 
     786                            $sc['allDay'] = 1; 
     787                            $sc['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $sc['timezone']) . '000'; 
     788                        } elseif (isset($startTime['params']['TZID']) && !isset($startTime['value']['tz']))/* Caso não tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */ 
     789                            $sc['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $startTime['params']['TZID']) . '000'; 
     790                        else { 
     791                            $sc['startTime'] = self::date2timestamp($startTime['value']) . '000'; 
     792                            if (strpos($params['prodid'], 'Outlook') !== false) { 
     793                                //Se o ics veio em utc não aplicar horario de verão 
     794                                $sTime = new DateTime('@' . (int) ($sc['startTime'] / 1000), new DateTimeZone('UTC')); 
     795                                $sTime->setTimezone($objTimezone); 
     796                                if ($sTime->format('I')) //Se o ics veio em utc não aplicar horario de verão 
     797                                $sc['startTime'] = $sc['startTime'] - 3600000; 
     798                            } 
     799                        } 
     800 
     801                        /* Data de Termino */ 
     802                        $endTime = $component->getProperty('dtend', false, true); 
     803 
     804                        if (isset($endTime['params']['VALUE']) && $endTime['params']['VALUE'] === 'DATE') 
     805                            $sc['endTime'] = self::date2timestamp($endTime['value']) - self::_getTzOffset('UTC', $sc['timezone']) . '000'; 
     806                        else if (isset($endTime['params']['TZID']) && !isset($endTime['value']['tz'])) /* Caso não tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */ 
     807                            $sc['endTime'] = self::date2timestamp($endTime['value']) - self::_getTzOffset('UTC', $endTime['params']['TZID']) . '000'; 
     808                        else { 
     809                            $sc['endTime'] = self::date2timestamp($endTime['value']) . '000'; 
     810                            if (strpos($params['prodid'], 'Outlook') !== false) { 
     811                                //Se o ics veio em utc não aplicar horario de verão 
     812                                $eTime = new DateTime('@' . (int) ($sc['endTime'] / 1000), new DateTimeZone('UTC')); 
     813                                $eTime->setTimezone($objTimezone); 
     814                                if ($eTime->format('I')) 
     815                                    $sc['endTime'] = $sc['endTime'] - 3600000; 
     816                            } 
     817                        } 
     818 
     819 
     820                        if ($uid = $component->getProperty('uid', false, false))                     
     821                            $sc['uid'] = $uid; 
     822 
     823                        $sc['summary'] = mb_convert_encoding($component->getProperty('summary', false, false), 'UTF-8', 'UTF-8,ISO-8859-1'); 
     824 
     825                        /* Definindo Description */ 
     826                        if ($desc = $component->getProperty('description', false, false)) 
     827                            $sc['description'] = mb_convert_encoding(str_ireplace(array('\n', '\t'), array("\n", "\t"), $desc), 'UTF-8', 'UTF-8,ISO-8859-1'); 
     828 
     829            if ($priority = $component->getProperty('priority', false, false)) 
     830                $sc['priority'] = mb_convert_encoding(str_ireplace(array('\n', '\t'), array("\n", "\t"), $priority), 'UTF-8', 'UTF-8,ISO-8859-1'); 
     831 
     832            if ($status = $component->getProperty('status', false, false)) 
     833                $sc['status'] = $this->decodeStatusTodo(mb_convert_encoding(str_ireplace(array('\n', '\t'), array("\n", "\t"), $status), 'UTF-8', 'UTF-8,ISO-8859-1')); 
     834 
     835            if ($percentage = $component->getProperty('percent-complete', false, false)) 
     836                $sc['percentage'] = mb_convert_encoding(str_ireplace(array('\n', '\t'), array("\n", "\t"), $percentage), 'UTF-8', 'UTF-8,ISO-8859-1'); 
     837 
     838            $todo->setProperty('priority', $v['priority']); 
     839            $todo->setProperty('percent-complete', $v['percentage']); 
     840            $todo->setProperty('status', $this->_getStatusTodo($v['status'])); 
     841 
     842                        /* Definindo location */ 
     843                        if ($location = $component->getProperty('location', false, false)) 
     844                            $sc['location'] = mb_convert_encoding($location, 'UTF-8', 'UTF-8,ISO-8859-1'); 
     845 
     846 
     847 
     848                        if ($property = $component->getProperty('organizer', FALSE, TRUE)) { 
     849                            $participant = array(); 
     850                            $mailUser = trim(str_replace('MAILTO:', '', $property['value'])); 
     851 
     852                            $participantID = mt_rand() . '2(Formatter)'; 
     853 
     854                            $participant['isOrganizer'] = '1'; 
     855 
     856                            $user = null; 
     857 
     858                            $participant['isExternal'] = 1; 
     859                            /* Gera um randon id para o contexto formater */ 
     860                            $userID = mt_rand() . '4(Formatter)'; 
     861 
     862                            $user['mail'] = $mailUser; 
     863                            $organizerMail = $mailUser; 
     864 
     865                            $user['name'] = ( isset($property['params']['CN']) ) ? $property['params']['CN'] : ''; 
     866                            $user['isExternal'] = '1'; 
     867                            $participant['user'] = $user; 
     868 
     869                            $sc['participants'][] = $participant; 
     870                        } 
     871 
     872 
     873                        $participant['status'] = isset($params['status']) ? $params['status'] : STATUS_ACCEPTED; 
     874                        $participant['isOrganizer'] = '0'; 
     875                        $participant['isExternal'] = 0; 
     876                        $participant['user'] = array('mail' => Config::me('mail'), 'name' => Config::me('cn')); 
     877                        $sc['participants'][] = $participant; 
     878                        $sc['type'] = TODO_ID; 
     879 
     880 
     881                        $ical['source'] = Controller::format(array('service' => 'iCal'), array($sc), array('method' => 'REPLY')); 
     882                        $ical['type'] = 'application/ics'; 
     883                        $ical['name'] = 'outlook.ics'; 
     884 
     885                        $ical2['source'] = $ical['source']; 
     886                        $ical2['type'] = 'text/calendar; method=REPLY'; 
     887                        $ical2['name'] = 'thunderbird.ics'; 
     888 
     889                        $timezone = new DateTimeZone('UTC'); 
     890                        $sTime = new DateTime('@' . (int) ($sc['startTime'] / 1000), $timezone); 
     891                        $eTime = new DateTime('@' . (int) ($sc['endTime'] / 1000), $timezone); 
     892 
     893                        if (isset($sc['timezone'])) { 
     894                            $sTime->setTimezone(new DateTimeZone($sc['timezone'])); 
     895                            $eTime->setTimezone(new DateTimeZone($sc['timezone'])); 
     896                        } 
     897 
     898                        $data = array('startDate' => date_format($sTime, 'd/m/Y'), 
     899                        'startTime' => (isset($sc['allDay']) && $sc['allDay'] ) ? '' : date_format($sTime, 'H:i'), 
     900                        'endDate' => date_format($eTime, 'd/m/Y'), 
     901                        'endTime' => isset($sc['allDay']) ? '' : date_format($eTime, 'H:i'), 
     902                        'eventTitle' => $sc['summary'], 
     903                        'eventLocation' => isset($sc['location']) ? $sc['location'] : '', 
     904                        'timezone' => ($sc['timezone']) ? $sc['timezone'] : 'UTC', 
     905                        'participant' => (isset($part['user']['name']) ? $part['user']['name'] : $part['user']['mail'])); 
     906 
     907                        $subject['notificationType'] = 'Convite Aceito'; 
     908                        $subject['eventTitle'] = mb_convert_encoding($sc['summary'], 'ISO-8859-1', 'ISO-8859-1,UTF-8'); 
     909                        $subject['startDate'] = date_format($sTime, 'd/m/Y'); 
     910                        $subject['startTime'] = ($sc['allDay']) ? '' : date_format($sTime, 'H:i'); 
     911                        $subject['endDate'] = date_format($eTime, 'd/m/Y'); 
     912                        $subject['endTime'] = ($sc['allDay']) ? '' : date_format($eTime, 'H:i'); 
     913                        $subject['participant'] = Config::me('uid'); 
     914 
     915                        $params['status'] = isset($params['status']) ? $params['status'] : STATUS_ACCEPTED; 
     916 
     917                        switch ($params['status']) { 
     918                            case STATUS_ACCEPTED: 
     919                                $tpl = 'notify_accept_body'; 
     920                                $subject['notificationType'] = 'Convite Aceito'; 
     921                                break; 
     922                            case STATUS_TENTATIVE: 
     923                                $tpl = 'notify_attempt_body'; 
     924                                $subject['notificationType'] = 'Convite  aceito provisoriamente'; 
     925                                break; 
     926                            case STATUS_CANCELLED: 
     927                                $tpl = 'notify_reject_body'; 
     928                                $subject['notificationType'] = 'Convite rejeitado'; 
     929                                break; 
     930                        } 
     931 
     932                        require_once ROOTPATH . '/api/parseTPL.php'; 
     933 
     934                        $mail = array(); 
     935                        $mail['attachments'][] = $ical; 
     936                        $mail['attachments'][] = $ical2; 
     937 
     938                        $mail['isHtml'] = true; 
     939                        $mail['body'] = parseTPL::load_tpl($data, ROOTPATH . '/modules/calendar/templates/' . $tpl . '.tpl'); 
     940                        $mail['subject'] = parseTPL::load_tpl($subject, ROOTPATH . '/modules/calendar/templates/notify_subject.tpl'); 
     941 
     942                        $mail['from'] = '"' . Config::me('cn') . '" <' . Config::me('mail') . '>'; 
     943                        $mail['to'] = $organizerMail; 
     944 
     945 
     946                        Controller::create(array('service' => 'SMTP'), $mail); 
     947                    } 
     948                } 
     949                break; 
     950 
     951            case 'REFRESH': 
     952                break; 
     953 
     954            case 'CANCEL': 
     955                if ($schedulable = self::_getSchedulable($uid)) 
     956                    $interation['schedulable://' . $schedulable['id']] = false; 
     957                break; 
     958 
     959            case 'ADD': 
     960                break; 
     961 
     962            case 'REPLY': 
     963                if ($schedulable = self::_getSchedulable($uid)) { 
     964                    while ($property = $component->getProperty('attendee', FALSE, TRUE)) 
     965                        if ($pID = self::_getParticipantByMail(str_replace('MAILTO:', '', $property['value']), $schedulable['participants'])) 
     966                            $interation['participant://' . $pID] = array('id' => $pID, 'status' => constant('STATUS_' . strtoupper($property['params']['PARTSTAT']))); 
     967 
     968                    $interation['schedulable://' . $schedulable['id']]['sequence'] = $schedulable['sequence'] + 1; 
     969                } 
     970                break; 
     971 
     972            case 'COUNTER': 
     973                if ($params['acceptedSuggestion'] !== 'false') { 
     974 
     975                    $schedulable = self::_getSchedulable($uid); 
     976                    $params['calendar'] = self::_existInMyCalendars($schedulable['id'], $params['owner']); 
     977 
     978                    $interation = self::_makeCOUNTER($schedulable, $component, $params); 
     979                    Config::regSet('noAlarm', FALSE); 
     980                } else { 
     981                    $response = array(); 
     982                    $response['from'] = $params['from']; 
     983                    $response['type'] = 'suggestionResponse'; 
     984                    $response['status'] = 'DECLINECOUNTER'; 
     985                    $response['schedulable'] = self::_getSchedulable($uid); 
     986 
     987                    Controller::create(array('concept' => 'notification'), $response); 
     988                } 
     989                break; 
     990 
     991            case 'DECLINECOUNTER': 
     992                break; 
     993 
     994            default: 
     995 
     996                $schedulable = self::_getSchedulable($uid); 
     997 
     998                if ($schedulable && ( self::_getTime($component, 'dtstamp') > $schedulable['dtstamp'] || $component->getProperty('sequence', false, false) > $schedulable['sequence'])) { //Caso o evento exista 
     999                    $interation = self::_makeVEVENT($schedulable, $component, $params); 
     1000 
     1001                    if (!self::_existInMyCalendars($schedulable['id'], $params['owner'])) { 
     1002                        $calendarToSchedulable = array(); 
     1003                        $calendarToSchedulable['calendar'] = $params['calendar']; 
     1004                        $calendarToSchedulable['schedulable'] = $schedulable['id']; 
     1005                        $interation['calendarToSchedulable://' . mt_rand() . '(Formatter)'] = $calendarToSchedulable; 
     1006                    } 
     1007                } 
     1008                else // Importar evento 
     1009                $interation = self::_makeVEVENT(array(), $component, $params); 
     1010 
     1011                break; 
     1012            } 
     1013     
     1014            $return[] = $interation; 
     1015        break; 
     1016        /***********************************************************************TODO*******************************************************************************/ 
     1017        case 'VTIMEZONE': 
     1018                break; 
    6391019            } 
    6401020        } 
     
    6531033            $interation = array(); 
    6541034            $uid = $component->getProperty('uid', false, false); //Resgata o uid do componente 
    655  
    6561035            switch (strtoupper($component->objName)) { 
    6571036                case 'VEVENT': 
     
    6591038                    switch ($method) { 
    6601039                        case 'PUBLISH': 
    661                             $interation = ICAL_ACTION_IMPORT; 
     1040                            $interation = array('action' => ICAL_ACTION_IMPORT, 'type' => 'calendarIds'); 
    6621041                            break; 
    6631042 
     
    6761055                                        if (!self::_existInMyCalendars($schedulable['id'], $params['owner'])) { 
    6771056                                            $interation = ICAL_ACTION_UPDATE; 
    678                                             $interation = ( strrpos($value['acl'], ATTENDEE_ACL_PARTICIPATION_REQUIRED) ) ? ICAL_ACTION_IMPORT_REQUIRED : ICAL_ACTION_IMPORT; 
     1057                                            $interation = ( strrpos($value['acl'], ATTENDEE_ACL_PARTICIPATION_REQUIRED) ) ? ICAL_ACTION_IMPORT_REQUIRED : array('action' => ICAL_ACTION_IMPORT, 'type' => 'calendarIds'); 
    6791058                                            break; 
    6801059                                        } 
     
    6891068                                    } 
    6901069                            }else 
    691                                 $interation = ICAL_ACTION_IMPORT; 
     1070                                $interation = array('action' => ICAL_ACTION_IMPORT, 'type' => 'calendarIds'); 
    6921071                             
    6931072                            if(($interation != ICAL_ACTION_NONE) && ($interation != ICAL_ACTION_ORGANIZER_NONE) && ($interation != ICAL_ACTION_ORGANIZER_UPDATE) && ($interation != ICAL_ACTION_NONE)) { 
     
    7441123                                $interation = ICAL_ACTION_NONE; 
    7451124                            else // Importar evento 
    746                                 $interation = ICAL_ACTION_IMPORT; 
     1125                                $interation = array('action' => ICAL_ACTION_IMPORT, 'type' => 'calendarIds'); 
     1126 
     1127                            break; 
     1128                    } 
     1129 
     1130                    $return[$uid] = $interation; 
     1131                    break; 
     1132                case 'VTODO': 
     1133                    switch ($method) { 
     1134                        case 'PUBLISH': 
     1135                            $interation = array('action' => ICAL_ACTION_IMPORT, 'type' => 'groupIds'); 
     1136                            break; 
     1137 
     1138                        case 'REQUEST': 
     1139                            $schedulable = self::_getSchedulable($uid); 
     1140                            
     1141                            if ($schedulable) { //Caso o evento exista 
     1142                                $isOrganizer = false; 
     1143                                $isParticipant = false; 
     1144 
     1145                                foreach ($schedulable['participants'] as $value) 
     1146                                    if ($value['user']['id'] == $params['owner']) { 
     1147                                        $isParticipant = true; 
     1148                                        if ($value['isOrganizer']) 
     1149                                            $isOrganizer = true; 
     1150 
     1151                                        if (!self::_existInMyCalendars($schedulable['id'], $params['owner'])) {    
     1152                                            $interation = array('action' => ICAL_ACTION_IMPORT, 'type' => 'groupIds'); 
     1153                                            break; 
     1154                                        } 
     1155                                    } else { 
     1156                                        if (self::_getTime($component, 'dtstamp') > $schedulable['dtstamp'] || $component->getProperty('sequence', false, false) > $schedulable['sequence']) //Organizador esta requisitando que você atualize o evento 
     1157                                            $interation = ($isOrganizer) ? ICAL_ACTION_ORGANIZER_UPDATE : ICAL_ACTION_UPDATE; 
     1158                                        else 
     1159                                            $interation = ($isOrganizer) ? ICAL_ACTION_ORGANIZER_NONE : ICAL_ACTION_NONE; 
     1160                                    } 
     1161                                if (!$isParticipant){ 
     1162                                      $interation = self::_checkParticipantByPermissions($schedulable); 
     1163                                    } 
     1164                            }else 
     1165                                $interation = array('action' => ICAL_ACTION_IMPORT, 'type' => 'groupIds'); 
     1166                            break; 
     1167 
     1168                        case 'REFRESH': 
     1169                            break; 
     1170 
     1171                        case 'CANCEL': 
     1172                            $interation = ICAL_ACTION_DELETE; 
     1173                            break; 
     1174 
     1175                        case 'ADD': 
     1176                            break; 
     1177 
     1178                        case 'REPLY': 
     1179                            $interation = ICAL_ACTION_REPLY; 
     1180                            break; 
     1181 
     1182                        case 'COUNTER': 
     1183                            $interation = ICAL_ACTION_SUGGESTION; 
     1184                            break; 
     1185 
     1186                        case 'DECLINECOUNTER': 
     1187                            $interation = ICAL_ACTION_NONE; 
     1188                            break; 
     1189 
     1190                        default: 
     1191                            $schedulable = self::_getSchedulable($uid); 
     1192 
     1193                            if ($schedulable && ( self::_getTime($component, 'dtstamp') > $schedulable['dtstamp'] || $component->getProperty('sequence', false, false) > $schedulable['sequence'])) //Caso o evento exista 
     1194                                $interation = ICAL_ACTION_UPDATE; 
     1195                            else if ($schedulable) 
     1196                                $interation = ICAL_ACTION_NONE; 
     1197                            else // Importar evento 
     1198                                $interation = array('action' => ICAL_ACTION_IMPORT, 'type' => 'groupIds'); 
    7471199 
    7481200                            break; 
     
    7521204                    break; 
    7531205                case 'VTIMEZONE': 
    754  
    755  
    756                     break; 
     1206                break; 
    7571207            } 
    7581208        } 
     
    7901240 
    7911241        return isset($a[$id]) ? $a[$id] : 'NEEDS-ACTION'; 
     1242    } 
     1243 
     1244    public function decodeStatusTodo( $action ) 
     1245    { 
     1246     $a = array( 
     1247        'NEED_ACTION' => STATUS_TODO_NEED_ACTION, 
     1248        'IN_PROGRESS' => STATUS_TODO_IN_PROGRESS  , 
     1249        'COMPLETED' =>  STATUS_TODO_COMPLETED , 
     1250        'CANCELLED'  => STATUS_TODO_CANCELLED 
     1251    ); 
     1252 
     1253    return isset($a[$id]) ? $a[$id] : 'STATUS_TODO_NEED_ACTION'; 
     1254     
     1255    } 
     1256 
     1257 
     1258    private function _getStatusTodo($id) { 
     1259        $a = array( 
     1260            STATUS_TODO_NEED_ACTION => 'NEED_ACTION', 
     1261            STATUS_TODO_IN_PROGRESS => 'IN_PROGRESS', 
     1262            STATUS_TODO_COMPLETED => 'COMPLETED', 
     1263            STATUS_TODO_CANCELLED => 'CANCELLED' 
     1264        ); 
     1265 
     1266    return isset($a[$id]) ? $a[$id] : 'NEED_ACTION'; 
    7921267    } 
    7931268 
     
    9071382    } 
    9081383 
    909     static private function _makeVEVENT($schedulable, $component, $params) { 
     1384        static private function _makeVEVENT($schedulable, $component, $params) { 
    9101385        $interation = array(); 
    9111386        $eventID = isset($schedulable['id']) ? $schedulable['id'] : mt_rand() . '(Formatter)'; 
     
    10081483        $participantsInEvent = array(); 
    10091484 
    1010         //TODO: Participants com delegated não estao sendo levados em conta 
     1485        //TODO: Participants com delegated nao estao sendo levados em conta 
    10111486        while ($property = $component->getProperty('attendee', FALSE, TRUE)) { 
    10121487            $participant = array(); 
     
    11891664        return $interation; 
    11901665    } 
     1666     
     1667    static private function _makeVTODO($schedulable, $component, $params) { 
     1668        $interation = array(); 
     1669        $todoID = isset($schedulable['id']) ? $schedulable['id'] : mt_rand() . '(Formatter)'; 
     1670 
     1671        /* Data de Inicio */ 
     1672        $startTime = $component->getProperty('dtstart', false, true); 
     1673 
     1674        $tzid = (isset($startTime['params']['TZID']) ? $startTime['params']['TZID'] : $params['X-WR-TIMEZONE']); 
     1675 
     1676        /* Tiem zone do evento */ 
     1677        if ($tzid){ 
     1678            $tzid = self::nomalizeTZID($tzid); 
     1679            $schedulable['timezone'] = $tzid; 
     1680        }else 
     1681            $schedulable['timezone'] = isset($params['calendar_timezone']) ? $params['calendar_timezone'] : 'America/Sao_Paulo'; 
     1682 
     1683        $objTimezone = new DateTimeZone($schedulable['timezone']); 
     1684 
     1685        if (isset($startTime['params']['VALUE']) && $startTime['params']['VALUE'] === 'DATE' && isset($params['calendar_timezone'])) { 
     1686            $schedulable['allDay'] = 1; 
     1687            $schedulable['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $schedulable['timezone'], '@' . self::date2timestamp($startTime['value'])) . '000'; 
     1688        } elseif ($tzid && !isset($startTime['value']['tz'])) {/* Caso não tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */ 
     1689            $schedulable['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $tzid, '@' . self::date2timestamp($startTime['value'])) . '000'; 
     1690            $schedulable['allDay'] = 0; 
     1691        } else { 
     1692            $schedulable['startTime'] = self::date2timestamp($startTime['value']) . '000'; 
     1693            if (strpos($params['prodid'], 'Outlook') !== false) { 
     1694                //Se o ics veio em utc não aplicar horario de verão 
     1695                $sTime = new DateTime('@' . (int) ($schedulable['startTime'] / 1000), new DateTimeZone('UTC')); 
     1696                $sTime->setTimezone($objTimezone); 
     1697                if ($sTime->format('I')) //Se o ics veio em utc não aplicar horario de verão 
     1698                    $schedulable['startTime'] = $schedulable['startTime'] - 3600000; 
     1699            } 
     1700        } 
     1701 
     1702        /* Data de Termino */ 
     1703        $endTime = $component->getProperty('dtend', false, true); 
     1704 
     1705        $tzid = isset($endTime['params']['TZID']) ? $endTime['params']['TZID'] : $params['X-WR-TIMEZONE']; 
     1706         
     1707        if($tzid) 
     1708            $tzid = self::nomalizeTZID($tzid); 
     1709 
     1710        if (isset($endTime['params']['VALUE']) && $endTime['params']['VALUE'] === 'DATE') 
     1711            $schedulable['endTime'] = self::date2timestamp($endTime['value']) - self::_getTzOffset('UTC', $schedulable['timezone'], '@' . self::date2timestamp($endTime['value'])) . '000'; 
     1712        else if ($tzid && !isset($endTime['value']['tz'])) /* Caso não tenha um tz na data mais exista um parametro TZID deve ser aplicado o timezone do TZID a data */ 
     1713            $schedulable['endTime'] = self::date2timestamp($endTime['value']) - self::_getTzOffset('UTC', $tzid, '@' . self::date2timestamp($endTime['value'])) . '000'; 
     1714        else { 
     1715            $schedulable['endTime'] = self::date2timestamp($endTime['value']) . '000'; 
     1716            if (strpos($params['prodid'], 'Outlook') !== false) { 
     1717                //Se o ics veio em utc não aplicar horario de verão 
     1718                $eTime = new DateTime('@' . (int) ($schedulable['endTime'] / 1000), new DateTimeZone('UTC')); 
     1719                $eTime->setTimezone($objTimezone); 
     1720                if ($eTime->format('I')) 
     1721                    $schedulable['endTime'] = $schedulable['endTime'] - 3600000; 
     1722            } 
     1723        } 
     1724 
     1725        $schedulable['type'] = '2'; //type schedulable 
     1726        $schedulable['summary'] = mb_convert_encoding($component->getProperty('summary', false, false), 'ISO-8859-1', 'UTF-8,ISO-8859-1'); 
     1727 
     1728        /* Definindo Description */ 
     1729        if ($desc = $component->getProperty('description', false, false)) 
     1730            $schedulable['description'] = mb_convert_encoding(str_ireplace(array('\n', '\t'), array("\n", "\t"), $desc), 'ISO-8859-1', 'UTF-8,ISO-8859-1'); 
     1731 
     1732        /* Definindo Class */ 
     1733        $class = $component->getProperty('class', false, false); 
     1734        if ($class && defined(constant(strtoupper('CLASS_' . $class)))) 
     1735            $schedulable['class'] = constant(strtoupper('CLASS_' . $class)); 
     1736        else if (!isset($schedulable['class'])) 
     1737            $schedulable['class'] = CLASS_PRIVATE; // padrão classe private 
     1738 
     1739        $schedulable['calendar'] = $params['calendar']; 
     1740 
     1741        $participantsInTodo = array(); 
     1742 
     1743        //TODO: Participants com delegated nao estao sendo levados em conta 
     1744        while ($property = $component->getProperty('attendee', FALSE, TRUE)) { 
     1745            $participant = array(); 
     1746 
     1747            $mailUser = trim(str_replace('MAILTO:', '', $property['value'])); 
     1748 
     1749            $participantID = ($tpID = self::_getParticipantByMail($mailUser, $schedulable['participants'])) ? $tpID : mt_rand() . '2(Formatter)'; 
     1750            $participant['schedulable'] = $eventID; 
     1751 
     1752            if (isset($params['status']) && $mailUser == Config::me('mail')) 
     1753                $participant['status'] = $params['status']; 
     1754            else 
     1755                $participant['status'] = (isset($property['params']['PARTSTAT']) && constant('STATUS_' . $property['params']['PARTSTAT']) !== null ) ? constant('STATUS_' . $property['params']['PARTSTAT']) : STATUS_UNANSWERED; 
     1756 
     1757 
     1758            $participant['isOrganizer'] = '0'; 
     1759 
     1760            /* Verifica se este usuario é um usuario interno do ldap */ 
     1761            $intUser = Controller::find(array('concept' => 'user'), array('id', 'isExternal'), array('filter' => array('OR', array('=', 'mail', $mailUser), array('=', 'mailAlternateAddress', $mailUser)))); 
     1762 
     1763            $user = null; 
     1764            if ($intUser && count($intUser) > 0) { 
     1765                $participant['isExternal'] = isset($intUser[0]['isExternal']) ? $intUser[0]['isExternal'] : 0; 
     1766                $participant['user'] = $intUser[0]['id']; 
     1767            } else { 
     1768                $participant['isExternal'] = 1; 
     1769                /* Gera um randon id para o contexto formater */ 
     1770                $userID = mt_rand() . '4(Formatter)'; 
     1771 
     1772                $user['mail'] = $mailUser; 
     1773                $user['isExternal'] = '1'; 
     1774                $user['name'] = ( isset($property['params']['CN']) ) ? $property['params']['CN'] : ''; 
     1775                $user['participants'] = array($participantID); 
     1776                $participant['user'] = $userID; 
     1777                $interation['user://' . $userID] = $user; 
     1778            } 
     1779 
     1780            $interation['participant://' . $participantID] = $participant; 
     1781            $schedulable['participants'][] = $participantID; 
     1782        }; 
     1783 
     1784        if ($property = $component->getProperty('organizer', FALSE, TRUE)) { 
     1785            $participant = array(); 
     1786            $mailUser = trim(str_replace('MAILTO:', '', $property['value'])); 
     1787 
     1788            $participantID = mt_rand() . '2(Formatter)'; 
     1789 
     1790            $participant['schedulable'] = $eventID; 
     1791            $participant['status'] = (isset($property['params']['PARTSTAT']) && constant('STATUS_' . $property['params']['PARTSTAT']) !== null ) ? constant('STATUS_' . $property['params']['PARTSTAT']) : STATUS_UNANSWERED; 
     1792            $participant['isOrganizer'] = '1'; 
     1793            $participant['acl'] = 'rowi'; 
     1794 
     1795            /* Verifica se este usuario é um usuario interno do ldap */ 
     1796            $intUser = Controller::find(array('concept' => 'user'), array('id', 'isExternal'), array('filter' => array('OR', array('=', 'mail', $mailUser), array('=', 'mailAlternateAddress', $mailUser)))); 
     1797 
     1798            $user = null; 
     1799            if ($intUser && count($intUser) > 0) { 
     1800                $participant['isExternal'] = isset($intUser[0]['isExternal']) ? $intUser[0]['isExternal'] : 0; 
     1801                $participant['user'] = $intUser[0]['id']; 
     1802            } else { 
     1803                $participant['isExternal'] = 1; 
     1804                /* Gera um randon id para o contexto formater */ 
     1805                $userID = mt_rand() . '4(Formatter)'; 
     1806 
     1807                $user['mail'] = $mailUser; 
     1808                $user['name'] = ( isset($property['params']['CN']) ) ? $property['params']['CN'] : ''; 
     1809                $user['participants'] = array($participantID); 
     1810                $user['isExternal'] = '1'; 
     1811                $participant['user'] = $userID; 
     1812                $interation['user://' . $userID] = $user; 
     1813            } 
     1814 
     1815            $interation['participant://' . $participantID] = $participant; 
     1816            $schedulable['participants'][] = $participantID; 
     1817            } else if (!isset($schedulable['participants']) || !is_array($schedulable['participants']) || count($schedulable['participants']) < 1) {//caso não tenha organizador o usuario se torna organizador 
     1818            $user = Controller::read(array('concept' => 'user', 'id' => $params['owner']), array('mail')); 
     1819 
     1820            if (!self::_getParticipantByMail($user['mail'], $schedulable['participants'])) { 
     1821                $participantID = mt_rand() . '2(Formatter)'; 
     1822 
     1823                $participant['schedulable'] = $todoID; 
     1824                $participant['status'] = STATUS_CONFIRMED; 
     1825                $participant['isOrganizer'] = '1'; 
     1826                $participant['acl'] = 'rowi'; 
     1827                $participant['isExternal'] = 0; 
     1828                $participant['user'] = $params['owner']; 
     1829                $interation['participant://' . $participantID] = $participant; 
     1830                $schedulable['participants'][] = $participantID; 
     1831            } 
     1832        } 
     1833         
     1834        $alarms = array(); 
     1835         
     1836        /* Definindo ALARMES */ 
     1837        while ($alarmComp = $component->getComponent('valarm')) 
     1838        { 
     1839                $alarm = array(); 
     1840                $alarmID = mt_rand() . '6(Formatter)'; 
     1841                $action =  $alarmComp->getProperty('action', false, true); 
     1842                $trygger = $alarmComp->getProperty('trigger', false, true); 
     1843                $alarm['type'] = self::decodeAlarmAction($action['value']); 
     1844 
     1845                 if(isset($trygger['value']['day'])) 
     1846                { 
     1847                        $alarm['time'] = $trygger['value']['day']; 
     1848                        $alarm['unit'] = 'd'; 
     1849                } 
     1850                else if(isset($trygger['value']['hour'])) 
     1851                { 
     1852                        $alarm['time'] = $trygger['value']['hour']; 
     1853                        $alarm['unit'] = 'h'; 
     1854                } 
     1855                else if(isset($trygger['value']['min'])) 
     1856                { 
     1857                        $alarm['time'] = $trygger['value']['min']; 
     1858                        $alarm['unit'] = 'm'; 
     1859                } 
     1860                 
     1861                foreach ($interation as $iint => &$vint) 
     1862                { 
     1863                        if(isset($vint['user']) && $vint['user'] == Config::me('uidNumber')) 
     1864                        { 
     1865                                $alarm['participant'] = str_replace('participant://', '', $iint);        
     1866                                $vint['alarms'][] = $alarmID; 
     1867                        } 
     1868                } 
     1869                $alarm['schedulable'] = $eventID; 
     1870                                 
     1871                $interation['alarm://' . $alarmID ] = $alarm; 
     1872                 
     1873        } 
     1874         
     1875         
     1876        /* Definindo DTSTAMP */ 
     1877        if ($dtstamp = self::_getTime($component, 'dtstamp')) 
     1878            $schedulable['dtstamp'] = $dtstamp; 
     1879 
     1880        /* Definindo TRANSP */ 
     1881        if (($tranp = $component->getProperty('transp', false, true)) && $tranp && is_string($tranp) && strtoupper($tranp) == 'OPAQUE') 
     1882            $schedulable['transparent'] = 1; 
     1883 
     1884        /* Definindo last_update */ 
     1885        if ($lastUpdate = self::_getTime($component, 'LAST-MODIFIED')) 
     1886            $schedulable['lastUpdate'] = $lastUpdate; 
     1887 
     1888 
     1889        if ($sequence = $component->getProperty('SEQUENCE', false, false)) 
     1890            $schedulable['sequence'] = $sequence; 
     1891 
     1892        if ($uid = $component->getProperty('uid', false, false)) 
     1893            ; 
     1894        $schedulable['uid'] = $uid; 
     1895 
     1896        while ($attach = $component->getProperty('ATTACH', FALSE, TRUE)) { 
     1897 
     1898            $attachCurrent = array('name' => $attach['params']['X-FILENAME'], 
     1899                'size' => strlen($attach['value']), 
     1900                'type' => self::_getContentType($attach['params']['X-FILENAME']) 
     1901            ); 
     1902 
     1903            $ids = Controller::find(array('concept' => 'attachment'), array('id'), array('filter' => array('AND', array('=', 'name', $attachCurrent['name']), array('=', 'size', $attachCurrent['size']), array('=', 'type', $attachCurrent['type'])))); 
     1904 
     1905            if (!is_array($ids)) { 
     1906                $attachCurrent['source'] = $attach['value']; 
     1907                //insere o anexo no banco e pega id para colcar no relacionamento                                
     1908                $idAttachment = Controller::create(array('concept' => 'attachment'), $attachCurrent); 
     1909            }else 
     1910                $idAttachment = array('id' => $ids[0]['id']); 
     1911 
     1912            $calendarToAttachmentId = mt_rand() . '2(Formatter)'; 
     1913            $calendarToAttachment['attachment'] = $idAttachment['id']; 
     1914            $calendarToAttachment['schedulable'] = $eventID; 
     1915            $interation['schedulableToAttachment://' . $calendarToAttachmentId] = $calendarToAttachment; 
     1916 
     1917            $schedulable['attachments'][] = $calendarToAttachmentId; 
     1918        } 
     1919 
     1920        $interation['schedulable://' . $todoID] = $schedulable; 
     1921 
     1922        return $interation; 
     1923    } 
    11911924 
    11921925    static private function _getSchedulable($uid) { 
     
    11961929 
    11971930    static private function _existInMyCalendars($id, $owner) { 
    1198         $sig = Controller::find(array('concept' => 'calendarSignature'), array('user', 'calendar', 'isOwner'), array('filter' => array('AND', array('=', 'user', $owner), array('=', 'isOwner', '1')))); 
     1931        $sig = Controller::find(array('concept' => 'calendarSignature'), array('user', 'calendar', 'isOwner'), array('filter' => array('AND', array('=', 'isOwner', '1'), array('=', 'user', $owner)))); 
    11991932        $calendars = array(); 
    12001933        foreach ($sig as $val) 
Note: See TracChangeset for help on using the changeset viewer.