/* Copyright (c) 2006-2009, Apple Inc. All rights reserved. */
/* Compressed JavaScript. Do not modify. */


/* calaccess.js */

if(window.Toolbar)Toolbar.autocreate=false;function documentShouldUnload(){if(window.gAppointmentController&&window.gAppointmentController.mEditMode){return Loc.unloadConfirm;}}
var TimeTextField=Class.create();TimeTextField.prototype={mSelectedDate:new Date(),mRestrictBeforeTimeField:null,mRestrictAfterTimeField:null,mDirty:false,initialize:function(inElement){bindEventListeners(this,['handleChanged','handleKeyPress']);this.mElement=$(inElement);this.mElement.addClassName('timetextfield');if(arguments.length>1)Object.extend(this,arguments[1]);observeEvents(this,this.mElement,{change:'handleChanged',keydown:'handleKeyPress'});this.updateShownDate();},handleChanged:function(inEvent){var dateStr=this.mElement.value;var hourDelta=(dateStr.toLowerCase().indexOf(Loc.ampm.pm.toLowerCase())<0?0:12);var hours=(-1);var minutes=0;var hoursAndMinutesMatch=dateStr.match(/(\d{1,2})[:-](\d{1,2})/);var hoursMatch=dateStr.match(/(\d{1,2})/);if(hoursAndMinutesMatch){hours=parseInt(hoursAndMinutesMatch[1])+hourDelta;minutes=parseInt(hoursAndMinutesMatch[2]);}
else if(hoursMatch){hours=parseInt(hoursMatch[1])+hourDelta;}
if(hours%12==0){hours=((hours/12)-1)*12;}
if((0>hours||hours>23)||(0>minutes||minutes>59)){this.updateShownDate();return false;}
var dt=new Date(this.mSelectedDate.getTime());dt.setHours(hours);dt.setMinutes(minutes);if(!this.setValue(dt,true))return false;this.mDirty=true;publisher().publish('TIME_FIELD_CHANGED',this,{value:this.getValue()});},handleKeyPress:function(inEvent){var delta=0;if(inEvent.keyCode==Event.KEY_DOWN){if(this.mSelectedDate.getHours()>0){delta=(-1);inEvent.stop();}}
else if(inEvent.keyCode==Event.KEY_UP){if(this.mSelectedDate.getHours()<23){delta=1;inEvent.stop();}}
if(delta!=0){var dt=new Date(this.mSelectedDate.getTime());dt.setHours(dt.getHours()+delta);if(this.setValue(dt,true)){this.mDirty=true;publisher().publish('TIME_FIELD_CHANGED',this,{value:this.getValue()});}}},updateShownDate:function(){this.mElement.value=this.mSelectedDate.formatDate(Loc.dateFormats.hourAndMinutes);},getValue:function(){return new Date(this.mSelectedDate.getTime());},setValue:function(inDateValue,inOptCheckValue){publisher().publish('SELECTED_DATE_WILL_CHANGE',this);if(inOptCheckValue&&((this.mRestrictBeforeTimeField&&inDateValue>this.mRestrictBeforeTimeField.mSelectedDate)||(this.mRestrictAfterTimeField&&inDateValue<this.mRestrictAfterTimeField.mSelectedDate))){this.updateShownDate();return false;}
var oldSelectedDate=this.mSelectedDate;this.mSelectedDate=inDateValue;this.updateShownDate();this.mDirty=false;publisher().publish('SELECTED_DATE_CHANGED',this,{selectedDate:this.mSelectedDate,oldSelectedDate:oldSelectedDate});return true;}}
var CalendarColorPicker=Class.create();CalendarColorPicker.prototype={initialize:function(inParentElement,inPopupElementID){this.mParentElement=$(inParentElement);replaceElementContents(inParentElement,Builder.node('a',{href:'#'},[Builder.node('span',{className:'calendarcolor_swatch'},"\u00A0"),Builder.node('span',{className:'calendarcolor_label'},Loc.calendar_color.blue)]));Element.addClassName(this.mParentElement,'calendarcolor_handle');this.mParentElement.down('a').observe('click',function(inEvent){inEvent.stop();if(!$(inPopupElementID)){var colorPopup=popupManager().createPopupElement('calendar_color_popup',inPopupElementID);RemoteCalendarCollection.defaultCalendarColors.each(function(currentColor,i){var itemCallback=function(){colorPopup.hide();this.mParentElement.down('span.calendarcolor_swatch').style.backgroundColor=currentColor;replaceElementContents(this.mParentElement.down('span.calendarcolor_label'),Loc.calendar_color[i]);}
var colorPopupItem=popupManager().itemWithTitle(colorPopup,Loc.calendar_color[i],null,itemCallback.bind(this));colorPopupItem.parentNode.insertBefore(Builder.node('span',{className:'calendarcolor_swatch',style:'background-color:'+currentColor}),colorPopupItem);}.bind(this));}
popupManager().show(this.mParentElement.down('a'),inPopupElementID,(-32));return false;}.bind(this));},getValue:function(){return String.hexValueForColorString(this.mParentElement.down('span.calendarcolor_swatch').style.backgroundColor);},setValue:function(inColorValue){this.mParentElement.down('span.calendarcolor_swatch').style.backgroundColor=inColorValue;var foundLabel=RemoteCalendarCollection.defaultCalendarColors.indexOf(inColorValue.toUpperCase());replaceElementContents(this.mParentElement.down('span.calendarcolor_label'),(foundLabel<0?Loc.custom_calendar_color:Loc.calendar_color[foundLabel]));}}
var AppointmentDialogManager=Class.createWithSharedInstance('appointmentDialog');AppointmentDialogManager.prototype={mAvailabilityWidth:450,mAvailabilityRange:[0,24],mTabs:['appointment_dialog_tab_general','appointment_dialog_tab_invitees','appointment_dialog_tab_notes'],initialize:function(){bindEventListeners(this,['handleAllDayChanged','handleTabLinkClicked','handleDeleteClick','handleRecurrenceTypeChanged','handleRecurrenceEndTypeChanged','handleAttendeeHeaderLinkClick','handleMouseDownInAttendeeTime','handleAttendeeTimeRescheduleMove','handleAttendeeTimeRescheduleEnd']);this.mAppointmentDialog=dialogManager().drawDialog('appointment_dialog',[{label:'appointment_dialog_summary',contents:'<input name="summary" id="appointment_dialog_summary" type="text" class="appointment_dialog_field" />'},{label:'appointment_dialog_location',contents:'<input name="location" id="appointment_dialog_location" type="text" class="appointment_dialog_field" />'},{label:'appointment_entry_starttime',contents:'<div id="appointment_dialog_dtstart"></div>'},{label:'appointment_entry_endtime',contents:'<div id="appointment_dialog_dtend"></div>'},{label:'',contents:'<label for="appointment_dialog_allday_checkbox" id="appointment_dialog_allday_label"><input type="checkbox" id="appointment_dialog_allday_checkbox" />'+Loc.appointment_entry_allday+'</label>'},{label:'appointment_dialog_calendar',contents:'<select id="appointment_dialog_calendar_select"></select>'},{label:'appointment_dialog_repeat_label',contents:'<select id="appointment_dialog_recurrence_select"></select>'},{label:'appointment_dialog_repeat_end_label',contents:'<div id="appointment_dialog_recurrence_end_container"><select id="appointment_dialog_recurrence_end_select"></select></div>'}],'appointment_dialog_ok');replaceElementContents(this.mAppointmentDialog.down('thead').down('td'),Builder.node('div',{className:'calendartoolbar',id:'appointment_dialog_tabs'},[Builder.node('ul',[Builder.node('li',{className:'first'},[Builder.node('a',{href:'#',id:'appointment_dialog_tab_general'},Loc.appointment_dialog_tab_general)]),Builder.node('li',{className:'middle'},[Builder.node('a',{href:'#',id:'appointment_dialog_tab_invitees'},Loc.appointment_dialog_tab_invitees)]),Builder.node('li',{className:'last'},[Builder.node('a',{href:'#',id:'appointment_dialog_tab_notes'},Loc.appointment_dialog_tab_notes)])])]));this.mInvitesAllowed=principalService().isIndividual();if(!this.mInvitesAllowed){$('appointment_dialog_tab_invitees').up('ul').addClassName('noInvitees');$('appointment_dialog_tab_invitees').up('li').remove();$('appointment_dialog_tab_notes').up('li').addClassName('middle');}
$$('#appointment_dialog_tabs a').invoke('observe','click',this.handleTabLinkClicked);this.mButtonsRow=$('appointment_dialog_ok').up('tr');this.mButtonsRow.parentNode.insertBefore(Builder.node('tr',[Builder.node('td',{colSpan:'2'},[Builder.node('ul',{id:'appointment_dialog_attendee_header'},[Builder.node('li',{className:'appointment_attendee_name'},'Name')]),Builder.node('div',{id:'appointment_dialog_attendees'},[Builder.node('ul',{id:'appointment_attendee_list'},[Builder.node('li',{className:'next_appointment_attendee'},[Builder.node('ul',{className:'appointment_attendee_availability'},[Builder.node('li',{className:'appointment_attendee_name'},[Builder.node('input',{type:'text',id:'appointment_next_attendee'})])])])]),Builder.node('div',{id:'appointment_attendee_schedtime'},"\u00A0")])])]),this.mButtonsRow);this.mButtonsRow.parentNode.insertBefore(Builder.node('tr',{className:'appointment_dialog_attendee_daterow'},[Builder.node('td',{colSpan:'2'},[Builder.node('a',{href:'#',id:'appointment_dialog_attendee_prevdate'},'<'),Builder.node('span',{id:'appointment_dialog_attendee_date'},'-'),Builder.node('a',{href:'#',id:'appointment_dialog_attendee_nextdate'},'>')])]),$('appointment_dialog_attendee_header').up('tr'));this.mAvailabilityCellWidth=this.mAvailabilityWidth/(this.mAvailabilityRange[1]-this.mAvailabilityRange[0]);$('appointment_dialog_attendee_header').down('li.appointment_attendee_name').setStyle({marginRight:'0'});var headerRow=$('appointment_dialog_attendee_header');for(var i=this.mAvailabilityRange[0];i<this.mAvailabilityRange[1];i+=2){headerRow.appendChild(Builder.node('li',{className:'appointment_attendee_availability_header',style:'width:'+((this.mAvailabilityCellWidth*2)-(SafariFixes.isWebKit?1:0)-(IEFixes.isIE?1:0))+'px'},[Builder.node('span',Loc.getLocalizedHourKey(i))]));}
if(this.mInvitesAllowed){this.mAttendeeSearchField=new CalendarPrincipalSearchField('appointment_next_attendee',{mStartedItemSearchCallback:function(){},mClickedItemCallback:function(inUID,inURL){if(inURL){this.addAttendee(this.mAttendeeSearchField.mChosenDataSource);$('appointment_next_attendee').value='';this.updateAttendeeTimeFromFields();this.getFreeBusyReport();}}.bind(this)});this.mAttendeeSearchField.old_handleChanged=this.mAttendeeSearchField.handleChanged;this.mAttendeeSearchField.handleChanged=function(e){var attendeeValue=this.mAttendeeHint.getValue();if(attendeeValue.match(FreeBusyLookup.emailAddressTest)){this.addAttendee({uid:'mailto:'+attendeeValue.replace(/^mailto:/,''),displayname:attendeeValue});$('appointment_next_attendee').value='';this.updateAttendeeTimeFromFields();Event.stop(e);return false;}
return this.mAttendeeSearchField.old_handleChanged(e);}.bindAsEventListener(this);this.mLocationSearchField=new CalendarPrincipalSearchField('appointment_dialog_location',{mFindResourceTypes:['locations'],mClickedItemCallback:function(inURL,inURL){var location=this.mLocationSearchField.mChosenDataSource;location.cutype='ROOM';var removedRoom=this.mShownAppointment.removeRoomAttendee();if(removedRoom){var removedRoomElm=$('appointment_attendee_uid_'+removedRoom);if(removedRoomElm)removedRoomElm.remove();}
this.addAttendee(location);}.bind(this),mSearchResultCallback:function(inResponseObj){var gotFreeBusyCallback=function(inResult){this.mLocationSearchField.mRows.each(function(row,i){var elm=$('appointment_dialog_location_results_'+row.uid);var fbForElm=inResult.detect(function(result){return(result.recipient==row.uid);});if(elm&&fbForElm&&fbForElm.blocks&&fbForElm.blocks.length>0){Element.addClassName(elm,'appointment_busy_location');}
else if(elm&&fbForElm&&fbForElm.blocks){Element.addClassName(elm,'appointment_free_location');}}.bind(this));}
if(inResponseObj&&inResponseObj.length>0){this.mShownAppointment.getFreeBusyReport(gotFreeBusyCallback.bind(this),null,null,inResponseObj);}}.bind(this)});this.mLocationSearchField.mResultTable.id='appointment_dialog_location_results';}
this.mAttendeeHint=new HintedTextField('appointment_next_attendee',Loc.appointment_dialog_addattendee_hint);this.mButtonsRow.parentNode.insertBefore(Builder.node('tr',[Builder.node('td',{colSpan:'2'},[Builder.node('textarea',{id:'appointment_dialog_notes'})])]),this.mButtonsRow);this.mDialogRows=$$('#appointment_dialog tbody tr');this.mDialogRows.pop();this.mTabbedRows=$A([$R(0,7),$R(8,9),$R(10,10)]);var recurrenceTypeSelect=$('appointment_dialog_recurrence_select');$A(['none','DAILY','WEEKLY','MONTHLY','YEARLY','-','custom']).each(function(key){recurrenceTypeSelect.appendChild(Builder.node('option',{value:key},Loc['appointment_dialog_repeat_'+key]||(key=='-'?"\u00A0":key)));});recurrenceTypeSelect.options[recurrenceTypeSelect.options.length-2].disabled=true;recurrenceTypeSelect.options[recurrenceTypeSelect.options.length-1].disabled=true;Event.observe(recurrenceTypeSelect,'change',this.handleRecurrenceTypeChanged);this.mRecurrenceEndTypeSelect=$('appointment_dialog_recurrence_end_select');var oldLabel=this.mRecurrenceEndTypeSelect.up('tr').down('th').down('label');this.mRecurrenceEndLabel=Builder.node('div',{style:'height:0;overflow:hidden'},Element.firstNodeValue(oldLabel));replaceElementContents(oldLabel,this.mRecurrenceEndLabel);var recurrenceEndTypeSelect=$('appointment_dialog_recurrence_end_select');this.mRecurrenceEndContainer=$('appointment_dialog_recurrence_end_container');this.mRecurrenceEndContainer.style['height']='0';this.mRecurrenceEndContainer.style['overflow']='hidden';$A(['never','after','on_date']).each(function(key){recurrenceEndTypeSelect.appendChild(Builder.node('option',{value:key},Loc['appointment_dialog_repeat_end_'+key]||key));});Event.observe(recurrenceEndTypeSelect,'change',this.handleRecurrenceEndTypeChanged);$('appointment_dialog_recurrence_end_container').appendChild(Builder.node('div',{id:'appointment_dialog_recurrence_end_after_container',style:'display:none'},[Builder.node('input',{type:'text',id:'appointment_dialog_recurrence_end_after'}),"\u00A0"+'times']));$('appointment_dialog_recurrence_end_container').appendChild(Builder.node('div',{id:'appointment_dialog_recurrence_end_ondate',style:'display:none'},"\u00A0"));this.mRecurrenceEndDatePicker=new NiftyDatePicker({mParentElement:'appointment_dialog_recurrence_end_ondate'});var td=$('appointment_dialog_ok').up('td');td.colSpan='1';td.parentNode.insertBefore(Builder.node('td',[Builder.node('div',{className:'submit'},[Builder.node('input',{type:'button',id:'appointment_dialog_delete',value:Loc.tags_rename_dialog_delete})])]),td);$('appointment_dialog_delete').onclick=this.handleDeleteClick;$('appointment_dialog_dtstart').appendChild(Builder.node('input',{type:'text',id:'appointment_dialog_dtstart_time'}));$('appointment_dialog_dtstart').appendChild(Builder.node('a',{href:'#',id:'appointment_dialog_dtstart_date'},'-'));this.mDialogStartDatePicker=new NiftyDatePicker({mParentElement:'appointment_dialog_dtstart_date',mStartWeekday:principalService().startWeekday()});this.mDialogStartTimePicker=new TimeTextField('appointment_dialog_dtstart_time');publisher().subscribe(this.handleDatePickerShown.bind(this),'DATE_PICKER_SHOWN',this.mDialogStartDatePicker);publisher().subscribe(this.handleStartTimeWillChange.bind(this),'SELECTED_DATE_WILL_CHANGE',this.mDialogStartDatePicker);publisher().subscribe(this.handleStartTimeWillChange.bind(this),'SELECTED_DATE_WILL_CHANGE',this.mDialogStartTimePicker);publisher().subscribe(this.handleStartTimeChanged.bind(this),'SELECTED_DATE_CHANGED',this.mDialogStartDatePicker);publisher().subscribe(this.handleStartTimeChanged.bind(this),'SELECTED_DATE_CHANGED',this.mDialogStartTimePicker);$('appointment_dialog_dtend').appendChild(Builder.node('input',{type:'text',id:'appointment_dialog_dtend_time'}));$('appointment_dialog_dtend').appendChild(Builder.node('a',{href:'#',id:'appointment_dialog_dtend_date'}));this.mDialogEndDatePicker=new NiftyDatePicker({mParentElement:'appointment_dialog_dtend_date',mStartWeekday:principalService().startWeekday()});this.mDialogEndTimePicker=new TimeTextField('appointment_dialog_dtend_time');publisher().subscribe(function(inMessage,inObject,inUserInfo){replaceElementContents('appointment_dialog_attendee_date',inUserInfo.selectedDate.formatDate(Loc.dateFormats.mediumDate));},'SELECTED_DATE_CHANGED',this.mDialogStartDatePicker);publisher().subscribe(function(inMessage,inObject,inUserInfo){this.mDialogStartDatePicker.setStartWeekday(inUserInfo.startWeekday);this.mDialogEndDatePicker.setStartWeekday(inUserInfo.startWeekday);}.bind(this),'START_WEEKDAY_CHANGED');publisher().subscribe(this.handleDatePickerShown.bind(this),'DATE_PICKER_SHOWN',this.mDialogEndDatePicker);$$('#appointment_dialog tr.appointment_dialog_attendee_daterow a').invoke('observe','click',this.handleAttendeeHeaderLinkClick);$('appointment_attendee_schedtime').observe('mousedown',this.handleMouseDownInAttendeeTime);$('appointment_dialog_allday_checkbox').observe('change',this.handleAllDayChanged);},selectTab:function(inTabIndex,inAnimateDialogSize){if(inAnimateDialogSize)targetedDialogManager().willResize();if(!this.mFakeTableBody){this.mFakeTableBody=Builder.node('tbody');d.body.appendChild(Builder.node('table',{style:'display:none'},[this.mFakeTableBody]));}
this.mDialogRows.each(function(row,i){if(this.mTabbedRows[inTabIndex].include(i)){if(!row.up('#appointment_dialog')){row.remove();this.mButtonsRow.parentNode.insertBefore(row,this.mButtonsRow);}}
else if(row.up('#appointment_dialog')){row.remove();this.mFakeTableBody.appendChild(row);}}.bind(this));if(inTabIndex==0){this.hideOrShowRecurrenceEnd();}
else if(inTabIndex==1){this.updateAttendeeTimeFromFields();this.getFreeBusyReport();}
if(inAnimateDialogSize)targetedDialogManager().didResize();if(inTabIndex>this.mTabs.size()-1)return;calendarViewController().setSelectedChild(this.mTabs[inTabIndex]);},show:function(inAppointment,inCancelCallback,inOKCallback,inOptElement,inOptDeleteCallback){var elm=inOptElement;if(!elm&&inAppointment.displayNodes){var node=inAppointment.displayNodes.detect(function(node){if(node.element)return true;});if(node)elm=node.element;}
if(!elm){tempApptDivs=$$('#module_calendars .temporary_calendar_appointment');if(tempApptDivs.length>0){elm=tempApptDivs[0];}}
if(inAppointment.mDesiredCalendar)delete inAppointment.mDesiredCalendar;this.mShownAppointment=inAppointment;this.mDeleteCallback=inOptDeleteCallback;if(!inAppointment.organizerIsPrincipal()){invitationDialog().show(inAppointment,inCancelCallback,inOKCallback,elm);return true;}
$('appointment_dialog_delete').style.display=inAppointment.isNew()?'none':'';this.selectTab(0);$('appointment_dialog_summary').value=inAppointment.summary()||'';$('appointment_dialog_location').value=inAppointment.location()||'';this.updateCalendarsInPopup();Form.setSelectValue('appointment_dialog_calendar_select',inAppointment.mParentCalendarFile.mParentCalendar.mLastPathComponent);this.setStartDateOnFields(inAppointment.startDate());$('appointment_dialog_allday_checkbox').checked=(inAppointment.banner()==true);this.handleAllDayChanged();this.setEndDateOnFields(inAppointment.endDate());$('appointment_dialog_recurrence_select').value=(inAppointment.recurrenceInfo()?inAppointment.recurrenceInfo().frequency():'none');this.handleRecurrenceTypeChanged();var cancelCallback=function(){this.mDialogStartDatePicker.hide();this.mDialogEndDatePicker.hide();if(inCancelCallback)inCancelCallback();}
var okCallback=function(){inAppointment.setBanner($('appointment_dialog_allday_checkbox').checked);inAppointment.setSummary($F('appointment_dialog_summary'));inAppointment.setLocation($F('appointment_dialog_location'));inAppointment.setStartDate(this.getStartDateFromFields());inAppointment.setEndDate(this.getEndDateFromFields());inAppointment.setRecurrenceFrequency($F('appointment_dialog_recurrence_select'));this.setDesiredCalendarFromFields(inAppointment);var idx=$('appointment_dialog_recurrence_select').selectedIndex;if(idx>0&&idx<5){var recurrenceInfo=inAppointment.recurrenceInfo();switch($('appointment_dialog_recurrence_end_select').selectedIndex){case 0:recurrenceInfo.setCount(null);break;case 1:recurrenceInfo.setCount($F('appointment_dialog_recurrence_end_after'));break;case 2:recurrenceInfo.setUntil(this.mRecurrenceEndDatePicker.mSelectedDate,inAppointment.banner());break;}}
inAppointment.setDescription($F('appointment_dialog_notes'));if(inOKCallback)inOKCallback();}
var m=elm?targetedDialogManager():dialogManager();m.show(this.mAppointmentDialog,cancelCallback.bind(this),okCallback.bind(this),elm);var elems=$('appointment_attendee_list').select('li.appointment_attendee');for(var i=0;i<elems.length;i++){elems[i].remove();}
var attendees=this.mShownAppointment.attendees();for(var j=0;j<attendees.length;j++){this.addAttendee(attendees[j]);}
$('appointment_dialog_notes').value=inAppointment.description()||'';},getStartDateFromFields:function(){var startDate=new Date(this.mDialogStartDatePicker.mSelectedDate.getTime());var startTime=this.mDialogStartTimePicker.getValue();startDate.setHours(startTime.getHours());startDate.setMinutes(startTime.getMinutes());startDate.setSeconds(0);return startDate;},setStartDateOnFields:function(inDate){this.mDialogStartDatePicker.setSelectedDate(inDate);this.mDialogStartTimePicker.setValue(inDate);},getEndDateFromFields:function(){var endDate=new Date(this.mDialogEndDatePicker.mSelectedDate.getTime());if($('appointment_dialog_allday_checkbox').checked)endDate.setDate(endDate.getDate()+1);var endTime=this.mDialogEndTimePicker.getValue();endDate.setHours(endTime.getHours());endDate.setMinutes(endTime.getMinutes());endDate.setSeconds(0);return endDate;},setEndDateOnFields:function(inDate){var endDate=new Date(inDate.getTime());if($('appointment_dialog_allday_checkbox').checked)endDate.setDate(endDate.getDate()-1);this.mDialogEndDatePicker.setSelectedDate(endDate);this.mDialogEndTimePicker.setValue(endDate);},setDesiredCalendarFromFields:function(inAppointment,inOptPopupElm){var calendarPopup=inOptPopupElm?$(inOptPopupElm):$('appointment_dialog_calendar_select');if($F(calendarPopup)!=inAppointment.mParentCalendarFile.mParentCalendar.mLastPathComponent){inAppointment.mDesiredCalendar=calendarViewController().mRemoteCalendarCollection.calendarWithPath($F(calendarPopup));}},hideOrShowRecurrenceEnd:function(){Element.setStyle(this.mRecurrenceEndLabel,{height:$('appointment_dialog_recurrence_select').selectedIndex%6==0?'0':'auto'});Element.setStyle(this.mRecurrenceEndContainer,{height:$('appointment_dialog_recurrence_select').selectedIndex%6==0?'0':'auto'});},updateCalendarsInPopup:function(inOptPopupElm){var calendarPopup=inOptPopupElm?$(inOptPopupElm):$('appointment_dialog_calendar_select');removeAllChildNodes(calendarPopup);calendarViewController().mRemoteCalendarCollection.mCalendars.each(function(calObj){calendarPopup.appendChild(Builder.node('option',{id:'appointment_dialog_calendar_'+calObj.mLastPathComponent,value:calObj.mLastPathComponent},(calObj.mDisplayName=='calendar'?Loc.calendar:calObj.mDisplayName)));});},updateAttendeeTimeFromFields:function(inOptDate){var firstHourElement=$('appointment_attendee_list').down('li.appointment_attendee_availability_cell');var schedElm=$('appointment_attendee_schedtime');schedElm.clonePosition(firstHourElement);schedElm.style.width=(parseInt(schedElm.style.width)-1)+'px';schedElm.style.height=((parseInt(schedElm.style.height)*($('appointment_attendee_list').childNodes.length-1))-2)+'px';var selectedStartDate=inOptDate||this.getStartDateFromFields();var dur=getDurationUsingEndDate(this.getStartDateFromFields(),this.getEndDateFromFields());var selectedEndDate=getEndDateUsingDuration(selectedStartDate,dur);var shownRange=$A([new Date(selectedStartDate.getTime()),new Date(selectedStartDate.getTime())]);shownRange[0].setHours(this.mAvailabilityRange[0]);shownRange[1].setHours(this.mAvailabilityRange[1]);if(selectedStartDate<shownRange[0]){selectedEndDate.setTime(selectedEndDate.getTime()-(shownRange[0].getTime()-selectedStartDate.getTime()));selectedStartDate.setTime(shownRange[0].getTime());}
if(selectedStartDate>shownRange[1]){selectedEndDate.setTime(shownRange[1].getTime());}
var hourWidth=schedElm.offsetWidth-1;var pos=parseInt(schedElm.style.left);pos+=(selectedStartDate.getHours()-shownRange[0].getHours())*hourWidth;pos+=(selectedStartDate.getMinutes()/60)*hourWidth;schedElm.style.left=pos+'px';var selectedDuration=getDurationUsingEndDate(selectedStartDate,selectedEndDate);schedElm.style.width=((getHoursForDuration(selectedDuration)*hourWidth)-2)+'px';},addAttendee:function(inAttendee){if(!this.mInvitesAllowed)return false;this.mShownAppointment.addAttendee(inAttendee);if($('appointment_attendee_uid_'+inAttendee.uid))return false;var attendeeDisplayName=inAttendee.displayname;if(!attendeeDisplayName&&!$('appointment_attendee_list').down('li.appointment_attendee')){if(this.mShownAppointment.organizerIsPrincipal()&&principalService().mUserPrincipalInfo){attendeeDisplayName=principalService().mUserPrincipalInfo.displayname;}
else{attendeeDisplayName=Loc.appointment_dialog_organizer_attendee;}}
var li=Builder.node('li',{id:'appointment_attendee_uid_'+inAttendee.uid,className:'appointment_attendee'},[Builder.node('ul',{className:'appointment_attendee_availability'},[Builder.node('li',{className:'appointment_attendee_name'},attendeeDisplayName)])]);if(inAttendee.uid==this.mShownAppointment.organizer().uid||inAttendee.status=='ACCEPTED'){li.down('li.appointment_attendee_name').addClassName('attendeestatus_accepted');}
else if(inAttendee.status=='TENTATIVE'){li.down('li.appointment_attendee_name').addClassName('attendeestatus_maybe');}
else if(inAttendee.status=='DECLINED'){li.down('li.appointment_attendee_name').addClassName('attendeestatus_declined');}
else if(inAttendee.status=='NEEDS-ACTION'||!inAttendee.status){li.down('li.appointment_attendee_name').addClassName('attendeestatus_unknown');}
if($('appointment_attendee_list').childNodes.length%2==0){li.addClassName('alternate_row');}
for(var i=this.mAvailabilityRange[0];i<this.mAvailabilityRange[1];i++){li.down('ul').appendChild(Builder.node('li',{className:'appointment_attendee_availability_cell appointment_attendee_hour_'+i,style:'width:'+this.mAvailabilityCellWidth+'px'},"\u00A0"));}
$('appointment_attendee_list').insertBefore(li,$('appointment_attendee_list').lastChild);inAttendee.deleteButton=new InlineDeleteButton(li.down('li.appointment_attendee_name'),function(){this.mShownAppointment.removeAttendeeWithUID(inAttendee.uid);li.remove();this.updateAttendeeTimeFromFields();}.bind(this),false);},getFreeBusyReport:function(){var startDate=new Date(this.mDialogStartDatePicker.mSelectedDate.getTime());var endDate=new Date(startDate.getTime());startDate.setHours(this.mAvailabilityRange[0]);startDate.setMinutes(0);startDate.setSeconds(0);endDate.setHours(this.mAvailabilityRange[1]);endDate.setSeconds(0);var gotFreeBusyCallback=function(inResult){if(gDebug&&!inResult)debugger;$$('#appointment_attendee_list li.appointment_freebusy_busy').invoke('remove');var firstHourElement=$('appointment_attendee_list').down('li.appointment_attendee_availability_cell');var absoluteStartPos=firstHourElement.offsetLeft;var hourWidth=firstHourElement.next().offsetLeft-absoluteStartPos;var hourHeight=firstHourElement.offsetHeight;inResult.each(function(response){if(!response)return;var elm=$('appointment_attendee_uid_'+response.recipient);if(!elm)return;if(response.requestStatus=='2.0;Success'){var attendee_ul=elm.down('ul');response.blocks.each(function(block){var blockLeft=absoluteStartPos+(getHoursForDuration(getDurationUsingEndDate(startDate,block.startDate))*hourWidth);var blockWidth=getHoursForDuration(block.duration)*hourWidth;var li=Builder.node('li',{className:'appointment_freebusy_busy appointment_freebusy_busy_'+block.type,style:'position:absolute;top:0;left:'+blockLeft+'px',title:Loc.getTimeRangeDisplayString(block.startDate,block.duration)},"\u00A0");attendee_ul.appendChild(li);Element.setOffsetWidth(li,blockWidth);});}});}
this.mShownAppointment.getFreeBusyReport(gotFreeBusyCallback.bind(this),startDate,endDate);},handleDatePickerShown:function(inMessage,inObject,inUserInfo){niftyDateHack(inMessage,inObject,inUserInfo);(inObject==this.mDialogStartDatePicker?this.mDialogEndDatePicker:this.mDialogStartDatePicker).hide();},handleAllDayChanged:function(){var isChecked=$('appointment_dialog_allday_checkbox').checked;if(isChecked==$('appointment_dialog_dtstart_time').disabled)return false;$('appointment_dialog_dtstart_time').disabled=isChecked;$('appointment_dialog_dtend_time').disabled=isChecked;var startDate=this.getStartDateFromFields();if(isChecked){startDate.setHours(0);startDate.setMinutes(0);startDate.setSeconds(0);var endDate=new Date(startDate.getTime());this.setEndDateOnFields(this.getEndDateFromFields());}
else{startDate.setHours(8);startDate.setMinutes(0);startDate.setSeconds(0);this.setStartDateOnFields(startDate);var endDate=new Date(startDate.getTime());endDate.setHours(9);this.setEndDateOnFields(endDate);$('appointment_dialog_dtstart_time').focus();}
(isChecked==true)?$('appointment_dialog').addClassName('allday'):$('appointment_dialog').removeClassName('allday');},handleStartTimeWillChange:function(inMessage,inObject,inUserInfo){this.mStartDateBeforeChange=this.getStartDateFromFields();},handleStartTimeChanged:function(inMessage,inObject,inUserInfo){if(!this.mStartDateBeforeChange)return;var delta=getDurationUsingEndDate(this.mStartDateBeforeChange,this.getStartDateFromFields());this.setEndDateOnFields(getEndDateUsingDuration(this.getEndDateFromFields(),delta));},handleTabLinkClicked:function(inEvent){inEvent.stop();var elm=inEvent.findElement('a');this.selectTab(this.mTabs.indexOf(elm.id),true);return false;},handleRecurrenceTypeChanged:function(){targetedDialogManager().willResize();this.hideOrShowRecurrenceEnd();var idx=0;if(this.mShownAppointment.recurrenceInfo()&&this.mShownAppointment.recurrenceInfo().count())idx=1;else if(this.mShownAppointment.recurrenceInfo()&&this.mShownAppointment.recurrenceInfo().until())idx=2;$('appointment_dialog_recurrence_end_select').selectedIndex=idx;this.handleRecurrenceEndTypeChanged();targetedDialogManager().didResize();},handleRecurrenceEndTypeChanged:function(inEvent){var idx=$('appointment_dialog_recurrence_end_select').selectedIndex;$('appointment_dialog_recurrence_end_after_container').style.display=(idx==1?'':'none');$('appointment_dialog_recurrence_end_ondate').style.display=(idx==2?'':'none');var recurrenceInfo=this.mShownAppointment.recurrenceInfo();if(idx==1){$('appointment_dialog_recurrence_end_after').value=(recurrenceInfo&&recurrenceInfo.count()?recurrenceInfo.count():'');if(inEvent)$('appointment_dialog_recurrence_end_after').focus();}
if(idx==2){var dateToSelect=(recurrenceInfo?recurrenceInfo.until():null);if(!dateToSelect){dateToSelect=this.mShownAppointment.startDate();dateToSelect.setDate(dateToSelect.getDate()+1);}
this.mRecurrenceEndDatePicker.setSelectedDate(dateToSelect);}},handleMouseDownInAttendeeTime:function(inEvent){Event.stop(inEvent);this.mDragStartPos=Event.pointerX(inEvent);this.mDragStartTime=this.getStartDateFromFields();this.mDragCurrentTime=this.mDragStartTime;var startTimeISO=dateObjToISO8601(this.mDragStartTime);this.mDragLowerLimit=createDateObjFromISO8601(startTimeISO.replace(/T.+$/,'T000000'));this.mDragUpperLimit=createDateObjFromISO8601(startTimeISO.replace(/T.+$/,'T234500'));observeEvents(this,d,{mousemove:'handleAttendeeTimeRescheduleMove',mouseup:'handleAttendeeTimeRescheduleEnd'});},handleAttendeeHeaderLinkClick:function(inEvent){inEvent.stop();var delta=(Event.findElement(inEvent,'a').id=='appointment_dialog_attendee_prevdate'?(-1):1);var dt=this.getStartDateFromFields();dt.setDate(dt.getDate()+delta);this.setStartDateOnFields(dt);this.getFreeBusyReport();return false;},handleAttendeeTimeRescheduleMove:function(inEvent){Event.stop(inEvent);var hourWidth=$$('#appointment_attendee_list li.appointment_attendee_availability_cell')[0].offsetWidth-2;this.mDragCurrentTime=new Date(this.mDragStartTime.getTime());var movedHours=(Event.pointerX(inEvent)-this.mDragStartPos)/hourWidth;this.mDragCurrentTime=getEndDateUsingDuration(this.mDragCurrentTime,getDurationForHours(movedHours));if(this.mDragCurrentTime<this.mDragLowerLimit||this.mDragCurrentTime>this.mDragUpperLimit)return false;this.mDragCurrentTime.setMinutes(Math.floor(this.mDragCurrentTime.getMinutes()/15)*15);this.mDragCurrentTime.setSeconds(0);this.updateAttendeeTimeFromFields(this.mDragCurrentTime);},handleAttendeeTimeRescheduleEnd:function(inEvent){Event.stop(inEvent);stopObservingEvents(this,d,{mousemove:'handleAttendeeTimeRescheduleMove',mouseup:'handleAttendeeTimeRescheduleEnd'});var dur=getDurationUsingEndDate(this.getStartDateFromFields(),this.getEndDateFromFields());this.setStartDateOnFields(this.mDragCurrentTime);this.setEndDateOnFields(getEndDateUsingDuration(this.mDragCurrentTime,dur));},handleDeleteClick:function(inEvent){dialogManager().hide();if(this.mDeleteCallback)this.mDeleteCallback();return false;}}
var InvitationDialogManager=Class.createWithSharedInstance('invitationDialog');InvitationDialogManager.prototype={initialize:function(){this.mInviteDialog=dialogManager().drawDialog('invitation_dialog',[{label:'appointment_dialog_summary',contents:'<div id="invitation_dialog_summary"></div>'},{label:'appointment_dialog_location',contents:'<div id="invitation_dialog_location"></div>'},{label:'invitation_dialog_date',contents:'<div id="invitation_dialog_date"></div>'},{label:'appointment_dialog_calendar',contents:'<select id="invitation_dialog_calendar_select"></select>'},{label:'invitation_dialog_attendees',contents:'<ul id="invitation_dialog_attendees"></ul>'},{label:'appointment_entry_description',contents:'<div id="invitation_dialog_notes"></div>'},{label:'invitation_dialog_mystatus',contents:'<select id="invitation_dialog_mystatus_select"></select>'}],'invitation_dialog_ok');this.mNotesRow=$('invitation_dialog_notes').up('tr');$A(['ACCEPTED','TENTATIVE','DECLINED']).each(function(partstat){$('invitation_dialog_mystatus_select').appendChild(Builder.node('option',{value:partstat},Loc['invitation_dialog_status_'+partstat]));});var td=$('invitation_dialog_ok').up('td');td.colSpan='1';td.parentNode.insertBefore(Builder.node('td',[Builder.node('div',{className:'submit'},[Builder.node('input',{type:'button',id:'invitation_dialog_delete',value:Loc.tags_rename_dialog_delete})])]),td);$('invitation_dialog_delete').onclick=appointmentDialog().handleDeleteClick;},addNotes:function(inNotes){if($$('#invitation_dialog #invitation_dialog_notes').length==0){$('invitation_dialog_mystatus_select').up('tr').insert({before:this.mNotesRow});}
replaceElementContents('invitation_dialog_notes',inNotes);$('invitation_dialog_notes').innerHTML=$('invitation_dialog_notes').innerHTML.replace(/[\r\n]/g,"\u00A0<br>");},removeNotes:function(){if($$('#invitation_dialog #invitation_dialog_notes').length>0){this.mNotesRow.remove();}},show:function(inAppointment,inCancelCallback,inOKCallback,inOptElement){appointmentDialog().updateCalendarsInPopup('invitation_dialog_calendar_select');var headerStr=String.format(Loc.invitation_dialog_header_format,{organizer:inAppointment.organizer().displayname||String.lastPathComponent(inAppointment.organizer().uid)});replaceElementContents(this.mInviteDialog.down('thead').down('td'),headerStr);replaceElementContents('invitation_dialog_summary',inAppointment.summary()||'');replaceElementContents('invitation_dialog_location',inAppointment.location()||'');var attendeesList=inAppointment.attendees();var isOrganizer=true;removeAllChildNodes('invitation_dialog_attendees');Element.removeClassName('invitation_dialog_attendees','massive_attendee_list');var attendeeIdx=0;var attendeeCount=attendeesList.length;while(attendeesList.length>0){var currentAttendee=attendeesList.shift();if(currentAttendee.cutype=='ROOM')continue;var li=Builder.node('li',(isOrganizer?String.format(Loc.invitation_dialog_organizer_format,{displayname:currentAttendee.displayname}):currentAttendee.displayname));if(++attendeeIdx>5){li.hide();}
$('invitation_dialog_attendees').appendChild(li);if(currentAttendee.uid==inAppointment.organizer().uid||currentAttendee.status=='ACCEPTED'){li.addClassName('attendeestatus_accepted');}
else if(currentAttendee.status=='TENTATIVE'){li.addClassName('attendeestatus_maybe');}
else if(currentAttendee.status=='DECLINED'){li.addClassName('attendeestatus_declined');}
else if(currentAttendee.status=='NEEDS-ACTION'||!currentAttendee.status){li.addClassName('attendeestatus_unknown');}
isOrganizer=false;}
if(attendeeCount>5){var showAllLink=Builder.node('a',{href:'#'},String.format(Loc.more_link_format,{count:attendeeCount}));$('invitation_dialog_attendees').appendChild(Builder.node('li',{className:'invitation_attendee_showall'},[showAllLink]));var showAllCallback=function(inEvent){inEvent.stop();dialogManager().willResize();$('invitation_dialog_attendees').addClassName('massive_attendee_list');$$('#invitation_dialog_attendees li').invoke('show');showAllLink.up('li').remove();dialogManager().didResize();return false;}
showAllLink.observe('click',showAllCallback.bind(this));}
replaceElementContents('invitation_dialog_date',Loc.getTimeRangeDisplayString(inAppointment.startDate(),inAppointment.duration()));var notes=inAppointment.description();if(notes&&notes.match(/\S/)){this.addNotes(notes);}
else{this.removeNotes();}
Form.setSelectValue('invitation_dialog_calendar_select',inAppointment.mParentCalendarFile.mParentCalendar.mLastPathComponent);Form.setSelectValue('invitation_dialog_mystatus_select',inAppointment.participantStatus());var okCallback=function(){appointmentDialog().setDesiredCalendarFromFields(inAppointment,'invitation_dialog_calendar_select');inAppointment.setParticipantStatus($F('invitation_dialog_mystatus_select'));if(inOKCallback)inOKCallback();}
var m=inOptElement?targetedDialogManager():dialogManager();m.show(this.mInviteDialog,inCancelCallback,okCallback.bind(this),inOptElement);}}
var CalendarPrincipalSearchField=Class.create();Object.extend(Object.extend(CalendarPrincipalSearchField.prototype,SearchFieldBase.prototype),{mFindResourceTypes:['users','locations','resources'],getDisplayString:function(inRow){return inRow.displayname;},constructQuery:function(inSearchString){if(this.mQueryStartCallback)this.mQueryingCallback();return principalService().getMatchingUsers(this.gotSearchResult.bind(this),inSearchString,this.mFindResourceTypes);}});function ie7ToolbarWorkaround(){return $$('#calendar_grid_toolbar ul.calendar_nav_view_picker li').inject(0,function(total,elm){return total+elm.offsetWidth;});}
function ie7DialogToolbarWorkaround(){return $$('#calendar_grid_toolbar ul.calendar_nav_view_picker li').inject(0,function(total,elm){return total+elm.offsetWidth;});}
var CalendarViewController=Class.createWithSharedInstance('calendarViewController',true);CalendarViewController.prototype={mBufferDays:32,mResizeHandleHeight:2,mSpacerWidth:2,mSnapHours:0.5,mRefreshTimeout:300000,mCleanupTimeout:2000,mDefaultHours:0.5,mMinimumHours:0.5,mMonthGridSize:[50,50],mBannerHeight:15,mMonthBannerHeight:15,mWeekEventElementOffsets:[0,-1,-2,-2],mSecondsInDay:86400000,mMinimumHourHeight:22,mMinimumDisplayHeight:14,initialize:function(){if(!$('module_calendars'))return invalidate;bindEventListeners(this,['handleMouseDownInCalendar','handleViewToolbarClick','handleMonthMoreButtonClick','handleTodayButtonClick','handleMakeCalendarClick','handleMouseDownInWeekTimedAppointment','handleWeekTimedAppointmentRescheduleMove','handleWeekTimedAppointmentRescheduleEnd','handleMouseDownInWeekTimedAppointmentSlot','handleWeekTimedAppointmentResizeMove','handleWeekTimedAppointmentResizeEnd','handleMouseDownInBannerAppointment','handleBannerAppointmentRescheduleMove','handleBannerAppointmentRescheduleEnd','handleMouseDownInBannerAppointmentSlot','handleBannerAppointmentResizeMove','handleBannerAppointmentResizeEnd','handleSettingsClick','handleAvailabilityTypeChanged','handleWindowResize']);if(gDebug)this.mRefreshTimeout=30000;this.mParentElement=$('module_calendars').up();tooltipManager().mShowTimeout=2500;this.drawCalendar();publisher().subscribe(this.handleCalendarError.bind(this),'ERROR_FROM_SERVER');dialogManager().showProgressMessage(Loc.updating_calendar_message);var gotUsernameCallback=function(){this.mViewSprings.boing();var titleLink=Builder.node('a',{href:'#'},["\u00A0"]);titleLink.onclick=invalidate;var calendarView=d.cookie.match(/calendarView=([^;]+)/);if(calendarView&&(calendarView[1]=='month')){this.mMonthMode=true;}
Event.observe('calendar_nav_timezone','click',this.handleSettingsClick);Event.observe('calendar_today_link','click',this.handleTodayButtonClick);this.mDateNavigation=new NiftyDatePicker({mElement:'calendar_date_picker',mStartWeekday:principalService().startWeekday()});publisher().subscribe(this.handleDateChanged.bind(this),'SELECTED_DATE_CHANGED',this.mDateNavigation);publisher().subscribe(this.handleStartWeekdayChanged.bind(this),'START_WEEKDAY_CHANGED');$('calendar_grid_sidebar_splitter').hide();this.snapSidebarSplitter();$('calendar_sidebar_notifications').style.height=(Element.getHeight('calendar_date_picker')-1)+'px';this.showDatePicker();$('calendar_sidebar_mkcalendar_button').observe('click',this.handleMakeCalendarClick);$('calendar_sidebar_toolbar_tab_date').observe('click',function(inEvent){inEvent.stop();this.showDatePicker();}.bind(this));$('calendar_sidebar_toolbar_tab_notifications').observe('click',function(inEvent){Event.stop(inEvent);this.showNotifications();}.bind(this));if(IEFixes.isIE&&!this.mMonthMode){this.mWeekEventSpacer.space();this.mWeekHeaderSpacer.space();this.mWeekBannerSpacer.space();}
$$('.calendar_grid_week_banner_slot').each(function(elm){Event.observe(elm,'mousedown',this.handleMouseDownInBannerAppointmentSlot);}.bind(this));var scroller=$('calendar_grid_week_events');scroller.scrollTop=(scroller.scrollHeight-Element.getHeight(scroller))/2;this.mFontSizeObserver=new SizeObserver($('calendar_grid_week_banner_columns').down('div.calendar_grid_hours_key').down('div'),1,this.handleFontSizeChanged.bind(this));this.drawTooltips();tooltipManager().mShowTimeout=2500;var gotCalendarCollection=function(){this.mViewSprings.boing();removeAllChildNodes('calendar_collection_list');this.mRemoteCalendarCollection.mCalendars.each(function(cal,i){var elmID='calendar_collection_'+cal.mLastPathComponent;var localizedCalendarName=(cal.mDisplayName=='calendar'?Loc.calendar:cal.mDisplayName);var collectionElm=Builder.node('li',{title:localizedCalendarName},[Builder.node('div',{className:'colorcheckbox_container'},[Builder.node('span',{className:'colorcheckbox_colorfill',style:'background-color:'+cal.mColor}),Builder.node('span',{className:'colorcheckbox_state colorcheckbox_checked'})]),Builder.node('span',{className:'calendar_collection_displayname'},localizedCalendarName),Builder.node('a',{href:'#',className:'calendar_info_button'},Loc.calendar_sidebar_info)]);collectionElm.down('a').onclick=invalidate;$('calendar_collection_list').appendChild(collectionElm);Event.observe(collectionElm,'mousedown',this.handleMouseDownInCalendar);}.bind(this));this.selectCalendar(this.mRemoteCalendarCollection.mCalendars.length>0?this.mRemoteCalendarCollection.mCalendars[0]:null);var dtstart=window.location.search.match(/dtstart=([^&]+)/);if(dtstart){var dt=createDateObjFromISO8601(dtstart[1],false);if(dt){var apptUidMatch=(window.location.hash||'').match(/#uid=(.+)$/);if(apptUidMatch){window.location.hash='';this.mShowAppointmentUID=apptUidMatch[1];}
this.mDateNavigation.setSelectedDate(dt);}}
else{this.mDateNavigation.setSelectedDate();}}
this.mRemoteCalendarCollection=new RemoteCalendarCollection(this.mCalCollectionHref);this.mIndividual=principalService().isIndividual();if(!this.mIndividual){$('calendar_sidebar_toolbar_tabs').addClassName('noInvitations');}
publisher().subscribe(gotCalendarCollection.bind(this),'GOT_CALENDAR_COLLECTION',this.mRemoteCalendarCollection);if(!IEFixes.isIE)observeEvents(this,window,{resize:'handleWindowResize'});}.bind(this);this.mCalCollectionHref='/calendars';var urlUserMatch=window.location.search.match(/username=([^&]+)/);if(urlUserMatch){principalService().setUserPrincipal('/principals/users/'+encodeURIComponent(urlUserMatch[1]));}
if(principalService().mUserPrincipalURL){var callback=function(inPrincipalInfo){if(inPrincipalInfo){this.mCalCollectionHref=String.addSlash(inPrincipalInfo.url);document.title=String.format(Loc.calendar_title_format,{principalDisplayName:inPrincipalInfo.displayname});gotUsernameCallback();}
else{debug_message('Princpial info not found for meta tag URL: '+principalService().mUserPrincipalURL);}}
principalService().getPrincipalInfo(callback.bind(this));}
else if(window.uid&&uid().mValue!=''){this.mCalCollectionHref+=uid().mParentLocation;}
else{this.mCalCollectionHref+='/users/'+encodeURIComponent(prompt('Username:'))+'/';}
if(arguments.length>0)Object.extend(this,arguments[0]);if(this.mCalCollectionHref!='/calendars')gotUsernameCallback();},handleCalendarError:function(inMessage,inObject,inUserInfo){var showError=function(inErrorString){dialogManager().hideProgressMessage();if($('calendar_mask').visible()){$('calendar_mask').style.visibility='visible';replaceElementContents($('calendar_mask').down('span'),inErrorString);}
else{alert(inErrorString);}}.bind(this);var status=inUserInfo.errorObj.status;if(inUserInfo.errorObj.getStatus&&!status)status=inUserInfo.errorObj.getStatus();if((status==503||status==502)&&inUserInfo.errorObj.getAllResponseHeaders&&inUserInfo.errorObj.getAllResponseHeaders().match(/Server:\s*Apache/)){showError(Loc.error_from_caldav_no_server);}
else if(status==403){showError(Loc.error_from_caldav_no_cal_allowed);}
else if(status==404){if(inObject==principalService()){showError(Loc.error_from_caldav_principal_not_found);}
else{showError(Loc.error_from_caldav_not_found);}}
else if(status==0){showError(Loc.error_from_caldav_probable_redirect);}
else{reportError(inUserInfo.errorObj);showError(Loc.error_from_caldav);}},resizeWeekViewCalendarGrid:function(){if(this.mDayMode||!$('calendar_grid_week_view').visible())return;var totalHeight=parseInt($('calendar_grid_week_events').style.height);var cellHeight=Math.max(this.mMinimumHourHeight,(totalHeight/12)-4);if(!this.mCachedWeekCells||this.mCachedWeekCells.length<1){this.mCachedWeekCells=$$('#calendar_grid_week_events_columns .calendar_grid_week_event_slot');}
if(this.mCachedWeekCells.length>0){if($('calendar_grid_week_events_columns').style.lineHeight!=cellHeight+'px'){$('calendar_grid_week_events_columns').down('div.calendar_grid_hours_key').style.paddingTop=(cellHeight/2)+'px';$('calendar_grid_week_events_columns').style.lineHeight=cellHeight+'px';if(this.mAppointments&&this.mAppointments.length>0)this.drawVisibleAppointments(false);}
this.mWeekGridSize=[this.mCachedWeekCells[0].offsetWidth,this.mCachedWeekCells[0].offsetHeight];}},springsResizeCallback:function(){if($('calendar_mask').visible()){Position.clone('module_calendars','calendar_mask');$('calendar_mask').style.width=(parseInt($('calendar_mask').style.width)-2)+'px';$('calendar_mask').style.height=(parseInt($('calendar_mask').style.height)-2)+'px';}
if(Element.visible('calendar_grid_week_view')){var h=parseInt($('calendar_grid_springs').style.height)-$('calendar_grid_week_events').offsetTop;Element.setOffsetHeight('calendar_grid_week_events',h);this.resizeWeekViewCalendarGrid();this.updateAvailableTimeShading();}
else{var h=parseInt($('calendar_grid_springs').style.height)-$('calendar_grid_month_content').offsetTop;Element.setOffsetHeight('calendar_grid_month_content',h);var testDivSlots=$('calendar_grid_month_weekday_columns').getElementsByClassName('calendar_grid_month_row_0');if(testDivSlots.length>0){this.mMonthGridSize=[testDivSlots[0].offsetWidth,testDivSlots[0].offsetHeight];}}
this.mBannerHeight=$('banner_sizing_appointment').offsetHeight;this.mMonthBannerHeight=$('month_banner_sizing_appointment').offsetHeight;this.snapSidebarSplitter();if(this.mNotificationsSplitView)this.mNotificationsSplitView.mDuringCallback();},buildCalendarGrid:function(){replaceElementContents('module_calendars',Builder.node('div',{id:'calendar_grid_springs'},[Builder.node('div',{id:'calendar_sidebar'},[Builder.node('div',{id:'calendar_splitter_parent'},[Builder.node('ul',{id:'calendar_collection_list'}),Builder.node('div',{id:'calendar_grid_sidebar_splitter',className:'splitter'},[Builder.node('div',{className:'splitter_handle'},"\u00A0")]),Builder.node('div',{id:'calendar_grid_splitter_sibling'},[Builder.node('div',{id:'calendar_date_picker'}),Builder.node('div',{id:'calendar_sidebar_notifications',style:'display:none'},[Builder.node('h2',Loc.notifications),Builder.node('ul',{id:'calendar_sidebar_notifications_content'})]),Builder.node('div',{id:'calendar_sidebar_toolbar'},[Builder.node('div',{className:'calendartoolbar',id:'calendar_sidebar_toolbar_tabs'},[Builder.node('ul',[Builder.node('li',{className:'first'},[Builder.node('a',{href:'#',id:'calendar_sidebar_mkcalendar_button',title:Loc.tooltips.new_calendar_collection},[Builder.node('span','+')])]),Builder.node('li',{className:'middle'},[Builder.node('a',{href:'#',id:'calendar_sidebar_toolbar_tab_date',title:Loc.tooltips.toggle_calendar_minimonth},[Builder.node('span',Loc.calendar_sidebar_datepicker_tab)])]),Builder.node('li',{className:'last'},[Builder.node('a',{href:'#',id:'calendar_sidebar_toolbar_tab_notifications',title:Loc.tooltips.toggle_calendar_inbox},[Builder.node('span',Loc.calendar_sidebar_inbox_tab)])])])])])])])]),Builder.node('div',{id:'calendar_grid_week_view'},[Builder.node('div',{id:'calendar_grid_week_header'},[Builder.node('ul',{id:'calendar_grid_week_header_columns',className:'calendar_grid_columns'},[Builder.node('li',{className:'use_content_size'},[Builder.node('div',{id:'calendar_grid_week_year'},"0000")])]),Builder.node('div',{className:'clear'})]),Builder.node('div',{id:'calendar_grid_week_banners'},[Builder.node('div',{className:'start startcalendar_grid_week_banners'},[Builder.node('span')]),Builder.node('div',{id:'calendar_grid_week_banners_content'},[Builder.node('ul',{id:'calendar_grid_week_banner_columns',className:'calendar_grid_columns'},[Builder.node('li',{className:'use_content_size'},[Builder.node('div',{className:'calendar_grid_hours_key'},[Builder.node('div')])])])]),Builder.node('div',{className:'end endcalendar_grid_week_banners clear'})]),Builder.node('div',{id:'calendar_grid_week_splitter',className:'splitter calendar_splitter'},[Builder.node('div',{className:'splitter_handle'},"\u00A0")]),Builder.node('div',{id:'calendar_grid_week_events'},[Builder.node('div',{className:'start startcalendar_grid_week_events'},[Builder.node('span')]),Builder.node('div',{id:'calendar_grid_week_events_content'},[Builder.node('ul',{id:'calendar_grid_week_events_columns',className:'calendar_grid_columns'},[Builder.node('li',{className:'use_content_size'},[Builder.node('div',{className:'calendar_grid_hours_key'})])]),Builder.node('div',{className:'clear'})]),Builder.node('div',{id:'calendar_grid_week_unavailable_morning',className:'calendar_grid_week_unavailable',style:'display:none'}),Builder.node('div',{id:'calendar_grid_week_unavailable_evening',className:'calendar_grid_week_unavailable',style:'display:none'}),Builder.node('div',{className:'end endcalendar_grid_week_events clear'})])]),Builder.node('div',{id:'calendar_grid_month_view',style:'display:none'},[Builder.node('div',{id:'calendar_grid_month_header'},"\u00A0"),Builder.node('div',{id:'calendar_grid_month_content'},[Builder.node('ul',{id:'calendar_grid_month_weekday_columns',className:'calendar_grid_columns'}),Builder.node('div',{className:'clear'})])]),Builder.node('div',{id:'banner_sizing_appointment',className:'calendar_appointment',style:'visibility:hidden'},"\u00A0"),Builder.node('div',{id:'month_banner_sizing_appointment',className:'calendar_appointment calendar_month_banner',style:'visibility:hidden'},"\u00A0")]));insertAtBeginning(Builder.node('div',{id:'calendar_grid_toolbar',className:'calendartoolbar'},[Builder.node('div',{id:'calendar_nav_today'},[Builder.node('a',{href:'#',id:'calendar_today_link'},Loc.today)]),Builder.node('ul',{className:'calendar_nav_view_picker'},[Builder.node('li',{id:'calendar_nav_date_prev',className:'first'},[Builder.node('a',{href:'#',id:'paginator_prev'},[Builder.node('span',"<")])]),Builder.node('li',{id:'calendar_nav_view_day',className:'middle'},[Builder.node('a',{href:'#',id:'paginator_day'},Loc.calendar_paginator_day)]),Builder.node('li',{id:'calendar_nav_view_week',className:'middle'},[Builder.node('a',{href:'#',id:'paginator_week',title:Loc.tooltips.week_button},Loc.calendar_paginator_week)]),Builder.node('li',{id:'calendar_nav_view_month',className:'middle'},[Builder.node('a',{href:'#',id:'paginator_month',title:Loc.tooltips.month_button},Loc.calendar_paginator_month)]),Builder.node('li',{id:'calendar_nav_date_next',className:'last'},[Builder.node('a',{href:'#',id:'paginator_next'},[Builder.node('span',">")])])]),Builder.node('div',{id:'calendar_nav_timezone'},[Builder.node('a',{href:'#',id:'calendar_settings_link'},Loc.calendar_settings)]),Builder.node('div',{className:'clear'})]),'module_calendars');insertAfter(Builder.node('div',{className:'clear'}),'calendar_grid_toolbar');var weekHeaderColumns=$('calendar_grid_week_header_columns');var weekBannerColumns=$('calendar_grid_week_banner_columns');for(var column=0;column<7;column++){weekHeaderColumns.appendChild(Builder.node('li',{className:'calendar_grid_banner_column'},[Builder.node('div',{className:'calendar_grid_column_contents calendar_grid_weekday_label'},"\u00A0")]));weekBannerColumns.appendChild(Builder.node('li',{className:'calendar_grid_week_column_'+column},[Builder.node('div',{className:'calendar_grid_column_contents calendar_grid_week_banner_slot'},"\u00A0")]))}
weekHeaderColumns.appendChild(Builder.node('li',{style:'use_content_size'}));if(!$('slideorigin')){insertAtBeginning(Builder.node('div',{id:'slideorigin',className:'slideorigin'}),'module_calendars');}
if(!$('calendar_mask')){$('module_calendars').appendChild(Builder.node('div',{id:'calendar_mask',style:'visiblility:visible'},[Builder.node('span')]));}},drawCalendar:function(){if(!$('calendar_grid_springs'))this.buildCalendarGrid();this.mViewSprings=new ViewSprings('calendar_grid_springs',this.springsResizeCallback.bind(this));$A($('calendar_grid_week_events_columns').getElementsByClassName('calendar_grid_hours_key')).each(function(elm){for(var hour=1;hour<24;hour++){elm.appendChild(Builder.node('div',(hour==12?Loc.noon:Loc.getLocalizedHourKey(hour))));}});if(Loc.appointment_allday!='All Day')$$('#calendar_grid_week_events_content div.calendar_grid_hours_key')[0].appendChild(Builder.node('div',{style:'position:relative;top:-5em;left:0;height:1px;margin:0;padding:0 0 0 1em;visibility:hidden'},Loc.appointment_allday));for(var column=0;column<7;column++){var li=Builder.node('li',{className:'calendar_grid_week_events_column calendar_grid_week_column_'+column});for(var row=0;row<24;row++){var slotDiv=Builder.node('div',{className:'calendar_grid_week_event_slot calendar_grid_week_row_'+row},IEFixes.isIE?"\u00A0":Loc.getLocalizedHourKey(row));if(IEFixes.isIE6)replaceElementContents(slotDiv,Builder.node('img',{src:'about:blank',alt:''}));if(IEFixes.isIE)slotDiv.style.textIndent='0';li.appendChild(slotDiv);slotDiv.onmousedown=this.handleMouseDownInWeekTimedAppointmentSlot;}
$('calendar_grid_week_events_columns').appendChild(li);}
$('calendar_grid_week_events_content').appendChild(Builder.node('div',{id:'current_time_indicator',style:'display:none'},[Builder.node('div')]));replaceElementContents($$('#calendar_grid_week_banner_columns div.calendar_grid_hours_key div')[0],Loc.appointment_allday);this.mWeekEventSpacer=new BlockSpacer('calendar_grid_week_events_columns',$('calendar_grid_week_events_content'));this.mWeekHeaderSpacer=new BlockSpacer('calendar_grid_week_header_columns',this.mWeekEventSpacer);this.mWeekBannerSpacer=new BlockSpacer('calendar_grid_week_banner_columns',this.mWeekEventSpacer);this.mSplitView=new SplitView('calendar_grid_week_view',{mViews:[$('calendar_grid_week_banners'),$('calendar_grid_week_events')],mSplitter:'calendar_grid_week_splitter',mMaintainTotalHeight:true,mMinimumHeight:23});this.mNotificationsSplitView=new SplitView('calendar_splitter_parent',{mDuringCallback:function(){if($('calendar_sidebar_notifications').visible()){var height=$('calendar_splitter_parent').offsetHeight;height-=$('calendar_grid_sidebar_splitter').offsetHeight;height-=$('calendar_sidebar_toolbar').offsetHeight;height-=$('calendar_collection_list').offsetHeight;$('calendar_sidebar_notifications').style.height=(height-1)+'px';}},mMinimumHeight:112,mMaximumHeight:500});for(var column=0;column<7;column++){var labelElm=Builder.node('div',{className:'calendar_grid_month_weekday_header',id:'calendar_grid_month_weekday_header_'+column},"foo");var columnElm=Builder.node('div',{className:'calendar_grid_column_contents calendar_grid_month_day_contents'});$('calendar_grid_month_weekday_columns').appendChild(Builder.node('li',{className:'calendar_grid_month_column_'+column},[labelElm,columnElm]));for(var row=0;row<6;row++){var labelElm=Builder.node('div',{className:'calendar_grid_month_daylabel'},"\u00A0");var elm=Builder.node('div',{className:'calendar_grid_month_day calendar_grid_month_row_'+row},[labelElm]);columnElm.appendChild(elm);Event.observe(elm,'mousedown',this.handleMouseDownInBannerAppointmentSlot);Event.observe(labelElm,'mousedown',this.handleMonthMoreButtonClick);}}
this.mMonthViewSpacers=[new BlockSpacer('calendar_grid_month_weekday_columns','calendar_grid_month_content')];$A($('calendar_grid_month_weekday_columns').getElementsByClassName('calendar_grid_month_day_contents')).each(function(elm){this.mMonthViewSpacers.push(new BlockSpacer(elm,(this.mMonthViewSpacers.length>1?this.mMonthViewSpacers[1]:'calendar_grid_month_content'),true));}.bind(this));$('module_calendars').style.visibility='';$$('#calendar_grid_toolbar ul.calendar_nav_view_picker a').each(function(a){Event.observe(a,'click',this.handleViewToolbarClick);}.bind(this));this.springsResizeCallback();if(IEFixes.isIE)insertAtBeginning(Builder.node('div',{style:'height:0'}),'calendar_grid_week_events_content');},drawTooltips:function(){d.body.appendChild(Builder.node('div',{id:'appointment_tooltip',className:'tooltip',style:'display:none'},[Builder.node('h2',{id:'appointment_tooltip_summary'}),Builder.node('h4',{id:'appointment_tooltip_time_string'}),Builder.node('dl',[Builder.node('dt',Loc.tt_location),Builder.node('dd',{id:'appointment_tooltip_location'}),Builder.node('dt',Loc.tt_description),Builder.node('dd',{id:'appointment_tooltip_description'})])]));},selectCalendar:function(inCalendar){this.mSelectedCalendar=inCalendar;if(!inCalendar)return;var calendarElements=$$('#calendar_collection_list li');calendarElements.invoke('removeClassName','calendar_selected_collection');var idx=this.mRemoteCalendarCollection.mCalendars.indexOf(inCalendar);calendarElements[idx].addClassName('calendar_selected_collection');},dataSourceForElement:function(inElement){var match=($(inElement).id||'').match(/appointment_div_(.+)_\d*$/);return(match?this.mAppointments[match[1]]:null);},handleMouseDownInCalendar:function(inEvent){var isCheckbox=false,isInfoButton=false;var isCheckbox=Event.findElement(inEvent,'div.colorcheckbox_container');if(!isCheckbox)isInfoButton=Event.findElement(inEvent,'a.calendar_info_button');inEvent.stop();var elm=Event.findElement(inEvent,'li');var cal=this.mRemoteCalendarCollection.mCalendars[elm.previousSiblings().length];if(isCheckbox){cal.mEnabled=!cal.mEnabled;var stateElm=elm.down('span.colorcheckbox_state');stateElm.className=stateElm.className.replace(/(colorcheckbox_)(un)?(checked)/,'$1'+(cal.mEnabled?'':'un')+'$3');this.mDateNavigation.setSelectedDate();}
else if(isInfoButton){this.showCalendarInfoDialog(cal,elm.down('a.calendar_info_button'));}
else{this.selectCalendar(cal);var mouseMovedCallback=function(inEvent){}.bindAsEventListener(this);var mouseUpCallback=function(inEvent){alert('up');}.bindAsEventListener(this);}},handleFontSizeChanged:function(inElement,inHeight){this.mViewSprings.boing();if(this.mMonthMode){this.mMonthViewSpacers.invoke('space');}
else{this.mWeekEventSpacer.space();this.mWeekHeaderSpacer.space();this.mWeekBannerSpacer.space();}
this.drawVisibleAppointments(false);},handleViewToolbarClick:function(inEvent){Event.stop(inEvent);var a=Event.findElement(inEvent,'a');if(a.id=='paginator_prev'){var dt=new Date(this.mDateNavigation.mSelectedDate.getTime());if(this.mMonthMode){dt.setMonth(dt.getMonth()-1);}
else{dt.setDate(dt.getDate()-(this.mDayMode?1:7))}
this.mDateNavigation.setSelectedDate(dt);}
else if(a.id=='paginator_day'){this.mMonthMode=false;this.mDayMode=true;this.mDateNavigation.setSelectedDate();}
else if(a.id=='paginator_week'){this.mMonthMode=false;this.mDayMode=false;this.mDateNavigation.setSelectedDate();}
else if(a.id=='paginator_month'){this.mMonthMode=true;this.mDayMode=false;this.mDateNavigation.setSelectedDate();}
else if(a.id=='paginator_next'){var dt=new Date(this.mDateNavigation.mSelectedDate.getTime());if(this.mMonthMode){dt.setMonth(dt.getMonth()+1);}
else{dt.setDate(dt.getDate()+(this.mDayMode?1:7))}
this.mDateNavigation.setSelectedDate(dt);}
return false;},handleMonthMoreButtonClick:function(inEvent){Event.stop(inEvent);var elm=Event.element(inEvent);dt=elm.up().id.match(/_(\d{8})/)[1];this.mMonthMode=false;this.mDateNavigation.setSelectedDate(createDateObjFromISO8601(dt,false));return false;},handleTodayButtonClick:function(inEvent){Event.stop(inEvent);this.mDateNavigation.setSelectedDate(new Date());return false;},handleMakeCalendarClick:function(inEvent){inEvent.stop();if(!$('mkcalendar_dialog')){dialogManager().drawDialog('mkcalendar_dialog',[{label:'mkcalendar_dialog_calendarname',contents:'<input type="text" id="mkcalendar_dialog_calendarname"/>'},{label:'mkcalendar_dialog_calendarcolor',contents:'<div id="mkcalendar_dialog_calendarcolor"></div>'}],'mkcalendar_dialog_ok');this.mMakeCalendarColorPicker=new CalendarColorPicker('mkcalendar_dialog_calendarcolor','mkcalendar_color_popup');}
this.mMakeCalendarColorPicker.setValue(this.mRemoteCalendarCollection.nextAvailableCalendarColor());var okCallback=function(){var madeCalendarCallback=function(){notifier().print('mkcalendar_confirm');}
var calendarName=$F('mkcalendar_dialog_calendarname');if(!calendarName.match(/\S/))calendarName=Loc.mkcalendar_untitled_calendar;this.mRemoteCalendarCollection.makeCalendar(calendarName,madeCalendarCallback,this.mMakeCalendarColorPicker.getValue());}
targetedDialogManager().show('mkcalendar_dialog',null,okCallback.bind(this),'calendar_sidebar_mkcalendar_button');},handleDateChanged:function(inMessage,inObject,inUserInfo){if(Element.visible(this.mParentElement)){this.updateCurrentTime();var range=this.dateRangeToFetch();var today=new Date();$('calendar_grid_week_year').update(inUserInfo.selectedDate.formatDate('Y'));var currentDate=new Date(inUserInfo.weekStartDate.getTime());$A($('calendar_grid_week_header_columns').getElementsByClassName('calendar_grid_weekday_label')).each(function(elm){replaceElementContents(elm,currentDate.formatDate(Loc.dateFormats.calendarDayHeader));currentDate.setDate(currentDate.getDate()+1);});currentDate=new Date(inUserInfo.weekStartDate.getTime());$A($('calendar_grid_week_banner_columns').getElementsByClassName('calendar_grid_week_banner_slot')).each(function(elm){elm.id='calendar_grid_week_banner_slot_'+parseInt(dateObjToISO8601(currentDate,false));currentDate.setDate(currentDate.getDate()+1);});replaceElementContents('calendar_grid_month_header',inUserInfo.weekStartDate.formatDate(Loc.dateFormats.longMonthAndYear));currentDate=new Date(inUserInfo.weekStartDate.getTime());$$('#calendar_grid_month_weekday_columns div.calendar_grid_month_weekday_header').each(function(hdrElm){replaceElementContents(hdrElm,currentDate.formatDate('l'));currentDate.setDate(currentDate.getDate()+1);});currentDate=new Date(inUserInfo.weekStartDate.getTime());currentDate.setDate(1);currentDate.setDate(1-(currentDate.getDay()-principalService().startWeekday()));for(var i=0;i<6;i++){$$('#calendar_grid_month_content .calendar_grid_month_row_'+i+' div.calendar_grid_month_daylabel').each(function(elm){replaceElementContents(elm,''+currentDate.getDate());elm.parentNode.id='calendar_grid_month_day_'+parseInt(dateObjToISO8601(currentDate,false));if(currentDate.getMonth()==inUserInfo.weekStartDate.getMonth()){elm.up().removeClassName('calendar_grid_othermonth_day');}
else{elm.up().addClassName('calendar_grid_othermonth_day');}
currentDate.setDate(currentDate.getDate()+1);});}
if(Element.visible(this.mMonthMode?'calendar_grid_week_view':'calendar_grid_month_view')){$('calendar_grid_week_view','calendar_grid_month_view').invoke('toggle');this.setLastView(this.mMonthMode?'month':'week');$H(this.mAppointments).each(function(currentAppt){currentAppt.value.displayNodes.each(function(currentNode){if(currentNode.element){Element.remove(currentNode.element);delete currentNode.element;}})});this.mViewSprings.boing();if(this.mMonthMode){this.mMonthViewSpacers.invoke('space');}
else{this.mWeekEventSpacer.space();this.mWeekHeaderSpacer.space();this.mWeekBannerSpacer.space();var scroller=$('calendar_grid_week_events');scroller.scrollTop=(scroller.scrollHeight-Element.getHeight(scroller))/2;}}
this.setSelectedChild(this.mMonthMode?'paginator_month':(this.mDayMode?'paginator_day':'paginator_week'));this.springsResizeCallback();if($('calendar_grid_week_view').visible()){$$('#calendar_grid_week_header_columns .calendar_grid_today_weekday_label').invoke('removeClassName','calendar_grid_today_weekday_label');$$('#calendar_grid_week_view .calendar_grid_week_today_column').invoke('removeClassName','calendar_grid_week_today_column');if(compareDateWeeks(today,inUserInfo.selectedDate,this.mDateNavigation.mStartWeekday)){var todayColNum=(today.getDay()+(7-this.mDateNavigation.mStartWeekday))%7;$$('#calendar_grid_week_header_columns .calendar_grid_weekday_label')[todayColNum].addClassName('calendar_grid_today_weekday_label');$$('#calendar_grid_week_view .calendar_grid_week_column_'+todayColNum).invoke('addClassName','calendar_grid_week_today_column');}
$$('#calendar_grid_week_header_columns .calendar_grid_selected_weekday_label').invoke('removeClassName','calendar_grid_selected_weekday_label');$$('#calendar_grid_week_view .calendar_grid_week_selected_column').invoke('removeClassName','calendar_grid_week_selected_column');var selectedDtstart=dateObjToISO8601(inUserInfo.selectedDate,false);var todayIsSelected=(parseInt(selectedDtstart)==parseInt(dateObjToISO8601(today,false)));var colNum=getDurationUsingEndDate(inUserInfo.weekStartDate,inUserInfo.selectedDate).days;if((!this.mDayMode)&&(!todayIsSelected)&&this.mAppointments&&$('calendar_grid_week_view').visible()){$$('#calendar_grid_week_header_columns .calendar_grid_weekday_label')[colNum].addClassName('calendar_grid_selected_weekday_label');$$('#calendar_grid_week_view .calendar_grid_week_column_'+colNum).invoke('addClassName','calendar_grid_week_selected_column');}
$A([this.mWeekEventSpacer,this.mWeekHeaderSpacer,this.mWeekBannerSpacer]).invoke((this.mDayMode?'zoomInOnItem':'zoomOut'),colNum);this.resizeWeekViewCalendarGrid();}
if($('calendar_grid_month_view').visible()){$$('#calendar_grid_month_content div.current_day_cell').invoke('removeClassName','current_day_cell');var todayElm=$('calendar_grid_month_day_'+parseInt(dateObjToISO8601(new Date())));if(todayElm)todayElm.addClassName('current_day_cell');$$('#calendar_grid_month_content div.selected_day_cell').invoke('removeClassName','selected_day_cell');var selectedDateElm=$('calendar_grid_month_day_'+parseInt(dateObjToISO8601(inUserInfo.selectedDate)));if(selectedDateElm)selectedDateElm.addClassName('selected_day_cell');}
this.drawVisibleAppointments(false);this.getAppointmentsFromServer();}},handleStartWeekdayChanged:function(inMessage,inObject,inUserInfo){this.mDateNavigation.setStartWeekday(inUserInfo.startWeekday);this.mDateNavigation.setSelectedDate();},handleMouseDownInWeekTimedAppointment:function(inEvent){Event.stop(inEvent);var pos=[Event.pointerX(inEvent),Event.pointerY(inEvent)];var elm=Event.element(inEvent).up('div.calendar_appointment').down('.calendar_appointment_content');var isResize=Event.element(inEvent).className&&Event.element(inEvent).className.match(/_resizehandle/);var appt=this.dataSourceForElement(elm.parentNode);var apptDiv=Builder.node('div',{className:'temporary_calendar_appointment'},appt.summary);$('calendar_grid_week_events_content').appendChild(apptDiv);['width','height','top','left'].each(function(s){apptDiv.style[s]=elm.parentNode.style[s];});appt.displayNodes.each(function(currentNode){if(currentNode.element)currentNode.element.style.visibility='hidden';});var allowedRange=[Element.getTop('calendar_grid_week_events')];allowedRange.push(allowedRange[0]+Element.getHeight('calendar_grid_week_events'));var weekday=(-1);var foundColumn=$A($('calendar_grid_week_events_columns').getElementsByClassName('calendar_grid_week_events_column')).detect(function(li,i){if(Position.within(li,pos[0],pos[1])){weekday=i;return true;}
return false;});if(!foundColumn)return false;this.mDragInfo={appt:appt,element:apptDiv,startWeekday:weekday,startPointer:pos,startTop:parseInt(apptDiv.style.top),startHeight:parseInt(apptDiv.style.height),allowedRange:allowedRange}
this.startDrag();var eventsToObserve={mouseup:isResize?'handleWeekTimedAppointmentResizeEnd':'handleWeekTimedAppointmentRescheduleEnd'};if(appt.organizerIsPrincipal()){eventsToObserve.mousemove=isResize?'handleWeekTimedAppointmentResizeMove':'handleWeekTimedAppointmentRescheduleMove';}
observeEvents(this,d,eventsToObserve);return false;},handleWeekTimedAppointmentRescheduleMove:function(inEvent){Event.stop(inEvent);var pos=[Event.pointerX(inEvent),Event.pointerY(inEvent)];if(!this.mDragInfo.threshold&&Math.abs(pos[0]-this.mDragInfo.startPointer[0])<this.mWeekGridSize[0]&&Math.abs(pos[1]-this.mDragInfo.startPointer[1])<(this.mWeekGridSize[1]/2)){return false;}
this.mDragInfo.threshold=true;var weekday=(-1);var foundColumn=$$('#calendar_grid_week_events_columns .calendar_grid_week_events_column').detect(function(li,i){if(Position.within(li,pos[0],pos[1])){weekday=i;return true;}
return false;});if(foundColumn&&this.mDragInfo.allowedRange[0]<=pos[1]&&pos[1]<=this.mDragInfo.allowedRange[1]){if(weekday!=this.mDragInfo.currentWeekday){Position.clone(foundColumn.firstChild,this.mDragInfo.element,{setHeight:false,setTop:false});this.mDragInfo.element.style.width=(parseInt(this.mDragInfo.element.style.width)+this.mWeekEventElementOffsets[2])+'px';this.mDragInfo.currentWeekday=weekday;}
var snapHeight=this.mWeekGridSize[1]*this.mSnapHours;var delta=pos[1]-this.mDragInfo.startPointer[1];delta=Math.floor(delta/snapHeight)*snapHeight;var top=this.mDragInfo.startTop+delta;this.mDragInfo.element.style.top=top+'px';}},handleWeekTimedAppointmentRescheduleEnd:function(inEvent){stopObservingEvents(this,d,{mousemove:'handleWeekTimedAppointmentRescheduleMove',mouseup:'handleWeekTimedAppointmentRescheduleEnd'});var dt=this.mDragInfo.appt.startDate();var dirty=false;if(this.mDragInfo.threshold){if(this.mDragInfo.currentWeekday!=null)dt.setDate(dt.getDate()+(this.mDragInfo.currentWeekday-this.mDragInfo.startWeekday));var hours=dt.getHours()+(dt.getMinutes()/60);hours+=(parseInt(this.mDragInfo.element.style.top)-this.mDragInfo.startTop)/this.mWeekGridSize[1];hours=Math.round(hours/this.mSnapHours)*this.mSnapHours;dt.setHours(Math.floor(hours));dt.setMinutes((hours-Math.floor(hours))*60);var dtstart=dateObjToISO8601(dt);dirty=(dtstart.replace(/Z$/,'')!=this.mDragInfo.appt.startDate(true).replace(/Z$/,''));this.mDragInfo.appt.setStartDate(dt);}
Element.remove(this.mDragInfo.element);this.endDrag();this.drawAppointment(this.mDragInfo.appt,false);if(dirty){this.mDragInfo.appt.setStartDate(dt);this.updateAppointmentEntry(this.mDragInfo.appt);}
else{this.showApptDetails(this.mDragInfo.appt);}
delete this.mDragInfo;},handleMouseDownInWeekTimedAppointmentSlot:function(inEvent){Event.stop(inEvent);var elm=Event.element(inEvent);var parentElm=Event.findElement(inEvent,'li');var rowMatch=elm.className.match(/calendar_grid_week_row_(\d+)/);var columnMatch=parentElm.className.match(/calendar_grid_week_column_(\d+)/);if(rowMatch&&columnMatch){var overlap=(Event.pointerY(inEvent)-Position.page(elm)[1])/this.mWeekGridSize[1];overlap=Math.floor(overlap/this.mSnapHours)*this.mSnapHours;var startDate=new Date(this.mDateNavigation.mWeekStartDate.getTime());startDate.setDate(startDate.getDate()+parseInt(columnMatch[1]));startDate.setHours(parseInt(rowMatch[1]));startDate.setMinutes(overlap*60);startDate.setSeconds(0);var apptDiv=Builder.node('div',{className:'temporary_calendar_appointment'},Loc.default_appt_summary);$('calendar_grid_week_events_content').appendChild(apptDiv);Position.clone(elm,apptDiv,{setWidth:false,setHeight:false});Element.setOffsetWidth(apptDiv,elm.offsetWidth);Element.setOffsetHeight(apptDiv,this.mWeekGridSize[1]*this.mDefaultHours);apptDiv.style.top=(parseInt(apptDiv.style.top)+(overlap*this.mWeekGridSize[1]))+'px';this.mDragInfo={element:apptDiv,startDate:startDate,startPointer:[Event.pointerX(inEvent),Event.pointerY(inEvent)],startHeight:this.mWeekGridSize[1]*this.mDefaultHours,maxSize:24-startDate.getHours()-overlap}
this.startDrag();observeEvents(this,d,{mousemove:'handleWeekTimedAppointmentResizeMove',mouseup:'handleWeekTimedAppointmentResizeEnd'});}
return false;},handleWeekTimedAppointmentResizeMove:function(inEvent){Event.stop(inEvent);var height=(Event.pointerY(inEvent)-this.mDragInfo.startPointer[1])+this.mDragInfo.startHeight;var snapHeight=this.mWeekGridSize[1]*this.mSnapHours;height=Math.floor(height/snapHeight)*snapHeight;height=Math.max(height,this.mWeekGridSize[1]*this.mMinimumHours);this.mDragInfo.element.style.height=height+'px';},handleWeekTimedAppointmentResizeEnd:function(inEvent){stopObservingEvents(this,d,{mousemove:'handleWeekTimedAppointmentResizeMove',mouseup:'handleWeekTimedAppointmentResizeEnd'});var height=parseInt(this.mDragInfo.element.style.height);var hours=height/this.mWeekGridSize[1];var overlap=hours-Math.floor(hours);overlap=Math.round(overlap/this.mSnapHours)*this.mSnapHours;hours=Math.floor(hours)+overlap;var appt=this.mDragInfo.appt;if(!appt){appt=this.mSelectedCalendar.createCalendarEvent();appt.setSummary(Loc.default_appt_summary);appt.setStartDate(this.mDragInfo.startDate);}
appt.setDuration(getDurationForHours(hours));this.endDrag();if((!this.mDragInfo.appt)||this.mDragInfo.appt.mIsNew){this.showApptDialog(appt);}
else{appt.displayNodes.each(function(currentNode){if(currentNode.element){$(currentNode.element).removeClassName('temporary_calendar_appointment');$(currentNode.element).addClassName('calendar_appointment');}});this.updateAppointmentEntry(appt);}},handleMouseDownInBannerAppointment:function(inEvent){Event.stop(inEvent);var pos=[Event.pointerX(inEvent),Event.pointerY(inEvent)];var elm=Event.element(inEvent);var isResize=elm.className&&elm.className.match(/_resizehandle/);var appt=this.dataSourceForElement(elm.up('.calendar_appointment'));appt.displayNodes.each(function(currentNode){if(currentNode.element){Element.removeClassName(currentNode.element,'calendar_appointment');Element.addClassName(currentNode.element,'temporary_calendar_appointment');}});var allDropZones=[];if($('calendar_grid_week_view').visible()){allDropZones=$A($('calendar_grid_week_banner_columns').getElementsByClassName('calendar_grid_week_banner_slot'));}
else{allDropZones=$A($('calendar_grid_month_weekday_columns').getElementsByClassName('calendar_grid_month_day'));}
var foundElm=allDropZones.detect(function(elm){return Position.within(elm,pos[0],pos[1])&&elm.id&&elm.id.match(/_\d{8}/);});if(!foundElm)return false;var clickedDate=createDateObjFromISO8601(foundElm.id.match(/_(\d{8})/)[1],false);var startDate=appt.startDate();var startOffsetDays=(clickedDate.getTime()-startDate.getTime())/this.mSecondsInDay;this.mDragInfo={appt:appt,allDropZones:allDropZones,startOffsetDays:startOffsetDays,startDate:startDate}
this.startDrag();var eventsToObserve={mouseup:isResize?'handleBannerAppointmentResizeEnd':'handleBannerAppointmentRescheduleEnd'};if(appt.organizerIsPrincipal()){eventsToObserve.mousemove=isResize?'handleBannerAppointmentResizeMove':'handleBannerAppointmentRescheduleMove';}
observeEvents(this,d,eventsToObserve);},handleBannerAppointmentRescheduleMove:function(inEvent){var pos=[Event.pointerX(inEvent),Event.pointerY(inEvent)];var foundElm=this.mDragInfo.allDropZones.detect(function(elm){return Position.within(elm,pos[0],pos[1])&&elm.id&&elm.id.match(/_\d{8}/);});if(!foundElm)return false;var dt=createDateObjFromISO8601(foundElm.id.match(/_(\d{8})/)[1],false);dt.setDate(dt.getDate()-this.mDragInfo.startOffsetDays);var dtstart=dateObjToISO8601(dt,false);appointmentDtstart=dateObjToISO8601(this.mDragInfo.appt.startDate());if(parseInt(dtstart)!=parseInt(appointmentDtstart)){var timeMatch=appointmentDtstart.match(/T\d{6}/);if(timeMatch){dtstart=dtstart.replace(/T\d{6}/,timeMatch[0]);}
this.mDragInfo.appt.setStartDate(createDateObjFromISO8601(dtstart));this.drawAppointment(this.mDragInfo.appt,false);this.mDragInfo.dirty=true;this.mDragInfo.appt.displayNodes.each(function(currentNode){if(currentNode.element){Element.addClassName(currentNode.element,'temporary_calendar_appointment');Element.removeClassName(currentNode.element,'calendar_appointment');}});}},handleBannerAppointmentRescheduleEnd:function(inEvent){stopObservingEvents(this,d,{mousemove:'handleBannerAppointmentRescheduleMove',mouseup:'handleBannerAppointmentRescheduleEnd'});this.mDragInfo.appt.displayNodes.each(function(currentNode){if(currentNode.element){$(currentNode.element).removeClassName('temporary_calendar_appointment');$(currentNode.element).addClassName('calendar_appointment');}});this.endDrag();if(this.mDragInfo.dirty){this.updateAppointmentEntry(this.mDragInfo.appt);}
else{this.showApptDetails(this.mDragInfo.appt);}},handleMouseDownInBannerAppointmentSlot:function(inEvent){Event.stop(inEvent);var elm=Event.element(inEvent);var elmDateMatch=elm.id.match(/_(\d{8})/);if(elmDateMatch){var allDropZones=[];if($('calendar_grid_week_view').visible()){allDropZones=$A($('calendar_grid_week_banner_columns').getElementsByClassName('calendar_grid_week_banner_slot'));}
else{allDropZones=$A($('calendar_grid_month_weekday_columns').getElementsByClassName('calendar_grid_month_day'));}
var appt=this.mSelectedCalendar.createCalendarEvent();appt.setSummary(Loc.default_appt_summary);appt.setBanner(true);appt.setStartDate(elmDateMatch[1]+'T000000');appt.setDuration('P1D');this.drawAppointment(appt,false);this.mDragInfo={appt:appt,allDropZones:allDropZones,startDate:appt.startDate()}
this.mAppointments[appt.uid]==appt;this.startDrag();observeEvents(this,d,{mousemove:'handleBannerAppointmentResizeMove',mouseup:'handleBannerAppointmentResizeEnd'});}
return false;},handleBannerAppointmentResizeMove:function(inEvent){Event.stop(inEvent);var pos=[Event.pointerX(inEvent),Event.pointerY(inEvent)];var foundElm=this.mDragInfo.allDropZones.detect(function(elm){return Position.within(elm,pos[0],pos[1])&&elm.id&&elm.id.match(/_\d{8}/);});if(foundElm){var startDate=this.mDragInfo.appt.startDate();var endDate=createDateObjFromISO8601(foundElm.id.match(/_(\d{8})/)[1]);endDate.setDate(endDate.getDate()+1);var duration={days:1};if(endDate>startDate){duration=getDurationUsingEndDate(startDate,endDate);}
this.mDragInfo.appt.setDuration(duration);this.drawAppointment(this.mDragInfo.appt,false);return false;this.mDragInfo.appt.setEndDate(Math.max(startDate,endDate));var duration=this.mDragInfo.appt.duration();if(duration.years<=0&&duration.months<=0&&duration.days<=0){this.mDragInfo.appt.setDuration('P1D');}
this.drawAppointment(this.mDragInfo.appt,false);}},handleBannerAppointmentResizeEnd:function(inEvent){Event.stop(inEvent);stopObservingEvents(this,d,{mousemove:'handleBannerAppointmentResizeMove',mouseup:'handleBannerAppointmentResizeEnd'});this.endDrag();if(this.mDragInfo.appt.mIsNew){this.showApptDialog(this.mDragInfo.appt);}
else{this.updateAppointmentEntry(this.mDragInfo.appt);}},revertTemporaryDisplayNodes:function(){if(this.mDragInfo&&this.mDragInfo.appt)this.mDragInfo.appt.displayNodes.each(function(currentNode){if(currentNode.element){$(currentNode.element).removeClassName('temporary_calendar_appointment');$(currentNode.element).addClassName('calendar_appointment');}});},handleSettingsClick:function(inEvent){inEvent.stop();this.showSettingsDialog();return false;},handleAvailabilityTypeChanged:function(inEvent){if(!$('calendar_settings_dialog_availability_options'))return false;this.mStartTimeField.mDirty=true;this.mEndTimeField.mDirty=true;$('calendar_settings_dialog_availability_options').style.display=($F('calendar_settings_dialog_availability')=='weekdays'?'':'none');},handleWindowResize:function(inEvent){this.mViewSprings.boing();if(this.mMonthMode){this.mMonthViewSpacers.invoke('space');}
else{this.mWeekEventSpacer.space();this.mWeekHeaderSpacer.space();this.mWeekBannerSpacer.space();}
this.drawVisibleAppointments(false);},setLastView:function(inViewName){var cookieExpire=new Date();cookieExpire.setFullYear(cookieExpire.getFullYear()+2);d.cookie='calendarView='+inViewName+'; expires='+cookieExpire.toGMTString()+'; path='+window.location.pathname;},showApptDetails:function(inAppointment){this.showApptDialog(inAppointment);},showApptDialog:function(inAppointment,inOptShowOverElement){if(this.mTimer){clearTimeout(this.mTimer);delete this.mTimer;}
this.mGetApptsRequest=null;var cancelButtonCallback=function(){$$('#module_calendars .temporary_calendar_appointment').invoke('remove');delete this.mDragInfo;this.getAppointmentsFromServer();}
var okButtonCallback=function(){this.updateAppointmentEntry(inAppointment);}
var deleteCallback=function(){var stopObservingExtraButtons=function(){if($('appointment_recur_warn_delete_nth_dialog_allapts'))Event.stopObserving('appointment_recur_warn_delete_nth_dialog_allapts');if($('appointment_recur_warn_delete_first_dialog_allappts'))Event.stopObserving('appointment_recur_warn_delete_first_dialog_allappts');}
var cancelCallback=function(){stopObservingExtraButtons();inAppointment.revertToSaved(true);this.drawAppointment(inAppointment);this.getAppointmentsFromServer();}
var onlyThisEventCallback=function(){stopObservingExtraButtons();inAppointment.createException();dialogManager().showProgressMessage('delete_appointment_progress');var saveCallback=function(){dialogManager().hideProgressMessage();poof().showOverElement(targetedDialogManager().mActiveParent);inAppointment.setVisible(false);this.drawVisibleAppointments();this.getAppointmentsFromServer();}
this.mRequest=inAppointment.saveToServer(saveCallback.bind(this));}
if(inAppointment.recurrenceID()){if(!$('appointment_recur_warn_delete_nth_dialog')){dialogManager().drawDialog('appointment_recur_warn_delete_nth_dialog',['appointment_recur_warn_delete_nth_dialog_desc'],'appointment_recur_warn_dialog_deleteonlythis');insertAfter(Builder.node('input',{type:'button',id:'appointment_recur_warn_delete_nth_dialog_allapts',value:Loc.appointment_recur_warn_dialog_deleteallfuture}),'appointment_recur_warn_delete_nth_dialog_cancel');}
var handleAllEventsClick=function(inEvent){Event.stop(inEvent);dialogManager().hide();stopObservingExtraButtons();inAppointment.detachRecurrence();dialogManager().showProgressMessage('delete_appointment_progress');var saveTruncatedCallback=function(){dialogManager().hideProgressMessage();poof().showOverElement(targetedDialogManager().mActiveParent);inAppointment.setVisible(false);this.drawAppointment(inAppointment);this.getRecurrencesFromServer(inAppointment);}
inAppointment.saveToServer(saveTruncatedCallback.bind(this));return false;}
Event.observe('appointment_recur_warn_delete_nth_dialog_allapts','click',handleAllEventsClick.bindAsEventListener(this));dialogManager().show('appointment_recur_warn_delete_nth_dialog',cancelCallback.bind(this),onlyThisEventCallback.bind(this));}
else if(inAppointment.recurrenceInfo()){if(!$('appointment_recur_warn_delete_first_dialog')){dialogManager().drawDialog('appointment_recur_warn_delete_first_dialog',['appointment_recur_warn_delete_first_dialog_desc'],'appointment_recur_warn_dialog_deleteonlythis');insertAfter(Builder.node('input',{type:'button',id:'appointment_recur_warn_delete_first_dialog_allappts',value:Loc.appointment_recur_warn_dialog_deleteallfuture}),'appointment_recur_warn_delete_first_dialog_cancel');}
var handleAllEventsClick=function(inEvent){Event.stop(inEvent);dialogManager().hide();stopObservingExtraButtons();this.deleteAppointmentFromServer(inAppointment);return false;}
Event.observe('appointment_recur_warn_delete_first_dialog_allappts','click',handleAllEventsClick.bindAsEventListener(this));dialogManager().show('appointment_recur_warn_delete_first_dialog',cancelCallback.bind(this),onlyThisEventCallback.bind(this));}
else if(confirm(Loc.delete_appointment_confirm_header)){this.deleteAppointmentFromServer(inAppointment);}}
var gotEventDetailsCallback=function(){dialogManager().hideProgressMessage();appointmentDialog().show(inAppointment,cancelButtonCallback.bind(this),okButtonCallback.bind(this),inOptShowOverElement,deleteCallback.bind(this));}
dialogManager().showProgressMessage('updating_event_message');inAppointment.fetchFullEventDetails(gotEventDetailsCallback.bind(this));},showCalendarInfoDialog:function(inCalendar,inShowOverElement){var defaultCalendarColors=this.mRemoteCalendarCollection.mDefaultCalendarColors;if(!$('calendar_info_dialog')){dialogManager().drawDialog('calendar_info_dialog',[{label:'calendar_info_dialog_calendarname',contents:'<input type="text" id="calendar_info_dialog_calendarname"/>'},{label:'calendar_info_dialog_calendarcolor',contents:'<div id="calendar_info_dialog_calendarcolor"></div>'},{label:'',contents:'<a href="#" id="calendar_info_dialog_calendar_subscription_url">'+Loc.calendar_info_dialog_subscribe+"\u00A0\u2192</a>"}],'calendar_info_dialog_ok');var td=$('calendar_info_dialog_ok').up('td');td.colSpan='1';td.parentNode.insertBefore(Builder.node('td',[Builder.node('div',{className:'submit'},[Builder.node('input',{type:'button',id:'calendar_info_dialog_delete',value:Loc.calendar_info_dialog_delete})])]),td);this.mCalendarInfoColorPicker=new CalendarColorPicker('calendar_info_dialog_calendarcolor','calendar_info_color_popup');}
$('calendar_info_dialog_calendarname').value=(inCalendar.mDisplayName=='calendar'?Loc.calendar:inCalendar.mDisplayName);$('calendar_info_dialog_calendar_subscription_url').href=inCalendar.iCalSubscriptionURL();if(this.mRemoteCalendarCollection.mCalendars.length<2)$('calendar_info_dialog_delete').hide();var deleteButtonCallback=function(){targetedDialogManager().hide();if(confirm(String.format(Loc.calendar_info_dialog_delete_confirm_format,{calendarName:(inCalendar.mDisplayName=='calendar'?Loc.calendar:inCalendar.mDisplayName)}))){var calendarDeleteCallback=function(){this.getAppointmentsFromServer();dialogManager().hideProgressMessage();var calendarElm=inShowOverElement.up('li');poof().showOverElement(calendarElm,function(){calendarElm.remove()});}
dialogManager().showProgressMessage('calendar_info_dialog_delete_progress');if(this.mTimer){clearTimeout(this.mTimer);delete this.mTimer;}
this.mRemoteCalendarCollection.deleteCalendar(inCalendar,calendarDeleteCallback.bind(this));}
return false;}
$('calendar_info_dialog_delete').onclick=deleteButtonCallback.bind(this);this.mCalendarInfoColorPicker.setValue(inCalendar.mColor);var okCallback=function(){var updatedName=$F('calendar_info_dialog_calendarname');var updatedColor=this.mCalendarInfoColorPicker.getValue();if(!(updatedName.match(/\S/)))return;dialogManager().showProgressMessage('calendar_info_dialog_save_progress');var renameCalendarCallback=function(){dialogManager().hideProgressMessage();replaceElementContents(inShowOverElement.up('li').down('span.calendar_collection_displayname'),updatedName);inShowOverElement.up('li').down('span.colorcheckbox_colorfill').style.backgroundColor=updatedColor;this.drawVisibleAppointments(false);notifier().print('calendar_info_dialog_save_confirm');}
inCalendar.renameCalendar(updatedName,updatedColor,renameCalendarCallback.bind(this));}
targetedDialogManager().show('calendar_info_dialog',null,okCallback.bind(this),inShowOverElement);},showSettingsDialog:function(){if(!$('calendar_settings_dialog')){dialogManager().drawDialog('calendar_settings_dialog',[{label:'calendar_settings_dialog_timezone',contents:'<select id="calendar_settings_dialog_tzid" name="calendar_settings_dialog_tzid"></select>'},{label:'calendar_settings_dialog_availability',contents:'<select id="calendar_settings_dialog_availability" name="calendar_settings_dialog_availability"></select><div id="calendar_settings_dialog_availability_options"></div>'},{label:'calendar_settings_dialog_startweekon',contents:'<select id="calendar_settings_dialog_startweekon" name="calendar_settings_dialog_startweekon"></select>'}],'calendar_settings_dialog_ok');var selectedTimezone=timezoneService().selectedTimezone();$('calendar_settings_dialog_tzid').appendChild(Builder.node('option',{value:selectedTimezone},selectedTimezone));var dialogFocusCallback=function(){var gotTimezonesCallback=function(inTimezones){var timezonePopup=$('calendar_settings_dialog_tzid');removeAllChildNodes(timezonePopup);var selectIndex=(-1);inTimezones.each(function(tzid,i){timezonePopup.appendChild(Builder.node('option',{value:tzid},tzid));if(tzid==selectedTimezone)selectIndex=i;});if(selectIndex>=0)timezonePopup.options[selectIndex].selected=true;}
timezoneService().getTimezoneList(gotTimezonesCallback);}
publisher().subscribe(dialogFocusCallback,'DIALOG_FOCUS',$('calendar_settings_dialog'));['weekdays','custom'].each(function(lbl){$('calendar_settings_dialog_availability').appendChild(Builder.node('option',{value:lbl},Loc['calendar_settings_dialog_availability_'+lbl]));});$('calendar_settings_dialog_availability').lastChild.disabled=true;$('calendar_settings_dialog_availability').observe('change',this.handleAvailabilityTypeChanged);var optionsDiv=$('calendar_settings_dialog_availability_options');optionsDiv.appendChild(Builder.node('input',{type:'text',id:'calendar_settings_dialog_availability_starttime'}));optionsDiv.appendChild(Builder.node('span'));optionsDiv.lastChild.appendChild(d.createTextNode(Loc.calendar_settings_dialog_availability_to));optionsDiv.appendChild(Builder.node('input',{type:'text',id:'calendar_settings_dialog_availability_endtime'}));this.mStartTimeField=new TimeTextField('calendar_settings_dialog_availability_starttime');this.mEndTimeField=new TimeTextField('calendar_settings_dialog_availability_endtime',{mRestrictAfterTimeField:this.mStartTimeField});this.mStartTimeField.mRestrictBeforeTimeField=this.mEndTimeField;var startWeekOnElm=$('calendar_settings_dialog_startweekon');['Sun','Mon','Tue','Wed','Thu','Fri','Sat'].each(function(wkdy){startWeekOnElm.appendChild(Builder.node('option',{value:wkdy.toLowerCase()},Loc.longWeekdays[wkdy]));});}
var availability=this.mRemoteCalendarCollection.mAvailability;Form.setSelectValue('calendar_settings_dialog_availability',(availability?'weekdays':'custom'));if(availability){this.mStartTimeField.setValue(availability.startDate());this.mEndTimeField.setValue(availability.endDate());}
else{var availStart=new Date();availStart.setHours(8);availStart.setMinutes(0);availStart.setSeconds(0);this.mStartTimeField.setValue(availStart);var availEnd=new Date();availEnd.setHours(18);availEnd.setMinutes(0);availEnd.setSeconds(0);this.mEndTimeField.setValue(availEnd);}
this.handleAvailabilityTypeChanged();$('calendar_settings_dialog_startweekon').selectedIndex=principalService().startWeekday();var okButtonCallback=function(){dialogManager().showProgressMessage('calendar_settings_dialog_saving_progress');var gotTimezonesCallback=function(){var gotOffsetsCallback=function(){var savedAvailabilityCallback=function(){var weekday=$('calendar_settings_dialog_startweekon').selectedIndex;if(weekday!=principalService().startWeekday())principalService().setStartWeekday(weekday);dialogManager().hideProgressMessage();notifier().print('calendar_settings_dialog_saved');this.getAppointmentsFromServer(true);}
if($F('calendar_settings_dialog_availability')=='weekdays'&&(this.mStartTimeField.mDirty||this.mEndTimeField.mDirty)){this.mRemoteCalendarCollection.setWeekdayAvailability(this.mStartTimeField.getValue(),this.mEndTimeField.getValue(),savedAvailabilityCallback.bind(this));}
else{savedAvailabilityCallback.bind(this)();}}
var range=this.dateRangeToFetch();timezoneService().fetchOffsetsForDateRange(gotOffsetsCallback.bind(this),range[0],range[1],$F('calendar_settings_dialog_tzid'));}
timezoneService().setSelectedTimezone($F('calendar_settings_dialog_tzid'),gotTimezonesCallback.bind(this));}
dialogManager().hide();targetedDialogManager().show('calendar_settings_dialog',null,okButtonCallback.bind(this),'calendar_settings_link');},deleteAppointmentFromServer:function(inAppointment){if(inAppointment.isNew()){$$('#module_calendars .temporary_calendar_appointment').invoke('remove');if(this.mDragInfo)delete this.mDragInfo;return;}
dialogManager().showProgressMessage('delete_appointment_progress');var callback=function(inRequestObj){var apptElm=targetedDialogManager().mActiveParent;dialogManager().hideProgressMessage();poof().showOverElement(apptElm);this.removeAppointment(inAppointment);this.mGetApptsRequest=null;this.gotAppointmentsFromServer(null,$A([]),inAppointment.uid);};this.mRequest=inAppointment.deleteFromServer(callback.bind(this));},updateAppointmentEntry:function(inAppointment){var movedCallback=function(){dialogManager().hideProgressMessage();this.mAppointments[inAppointment.uid]=inAppointment;if(inAppointment.displayNodes)inAppointment.displayNodes.each(function(currentNode){if(currentNode.element){$(currentNode.element).removeClassName('temporary_calendar_appointment');$(currentNode.element).addClassName('calendar_appointment');}});var inboxElm=$('inbox_event_'+inAppointment.uid);if(inboxElm)inboxElm.remove();if(!this.hasNotifications())this.hideNotificationsBadge();$$('.temporary_calendar_appointment').invoke('remove');if(inAppointment.startDate())this.mDateNavigation.setSelectedDate(inAppointment.startDate());notifier().print(Loc.appointment_saved_message);this.getRecurrencesFromServer(inAppointment);}
var saveCallback=function(){if(inAppointment.mDesiredCalendar){inAppointment.moveToCalendar(inAppointment.mDesiredCalendar,movedCallback.bind(this));delete inAppointment.mDesiredCalendar;}
else if(this.mInboxContents&&this.mInboxContents[inAppointment.uid]){this.mInboxContents[inAppointment.uid].deleteFromServer(movedCallback.bind(this));}
else{movedCallback.bind(this)();}}
var gotFullFileCallback=function(){inAppointment.mParentCalendarFile.mOriginalCalendarFile.deleteKeyFromMember('METHOD',inAppointment.mParentCalendarFile.mOriginalCalendarFile.mCalendarObj.VCALENDAR[0]);if((inAppointment.recurrenceID()&&!inAppointment.mEventStruct.RRULE)||(inAppointment.recurrenceInfo()&&inAppointment.updateStack().indexOf('RRULE')>=0)){if(!$('appointment_recur_warn_recur_dialog')){dialogManager().drawDialog('appointment_recur_warn_recur_dialog',['appointment_recur_warn_recur_dialog_desc'],'appointment_recur_warn_recur_dialog_change');}
var cancelCallback=function(){inAppointment.revertToSaved(true);this.drawVisibleAppointments();this.getAppointmentsFromServer();}
var changeCallback=function(){dialogManager().showProgressMessage('delete_appointment_progress');var detachedAppointment=inAppointment.detachRecurrence();if(detachedAppointment&&!inAppointment.organizerIsPrincipal()){var saveOriginalCallback=function(){this.mRequest=detachedAppointment.saveToServer(saveCallback.bind(this));}
var getDetachedRecurrencesCallback=function(){this.getRecurrencesFromServer(detachedAppointment,saveOriginalCallback.bind(this));}
this.mRequest=inAppointment.saveToServer(getDetachedRecurrencesCallback.bind(this));}
else{this.mRequest=inAppointment.saveToServer(saveCallback.bind(this));}}
dialogManager().show('appointment_recur_warn_recur_dialog',cancelCallback.bind(this),changeCallback.bind(this));}
else if(inAppointment.recurrenceID()){if(!$('appointment_recur_warn_change_nth_dialog')){dialogManager().drawDialog('appointment_recur_warn_change_nth_dialog',['appointment_recur_warn_change_nth_dialog_desc'],'appointment_recur_warn_dialog_onlythis');insertAfter(Builder.node('input',{type:'button',id:'appointment_recur_warn_change_nth_dialog_all',value:Loc.appointment_recur_warn_dialog_all}),'appointment_recur_warn_change_nth_dialog_cancel');}
var cancelCallback=function(){Event.stopObserving('appointment_recur_warn_change_nth_dialog_all');inAppointment.revertToSaved(true);this.drawVisibleAppointments();this.getAppointmentsFromServer();}
var handleAllEventsClick=function(inEvent){Event.stop(inEvent);Event.stopObserving('appointment_recur_warn_change_nth_dialog_all');dialogManager().showProgressMessage('appointment_save_progress');if(inAppointment.organizerIsPrincipal()){var detachedAppointment=inAppointment.detachRecurrence();var saveOriginalCallback=function(){this.mRequest=detachedAppointment.saveToServer(saveCallback.bind(this));}
var getDetachedRecurrencesCallback=function(){this.getRecurrencesFromServer(detachedAppointment,saveOriginalCallback.bind(this));}
this.mRequest=inAppointment.saveToServer(getDetachedRecurrencesCallback.bind(this));}
else{inAppointment.saveToServer(saveCallback.bind(this));}
return false;}
var onlyThisEventCallback=function(inEvent){this.removeAppointment(inAppointment);Event.stopObserving('appointment_recur_warn_change_nth_dialog_all');var excAppt=inAppointment.detachRecurrence(true);excAppt.setRecurrenceFrequency('NONE');var saveExceptionCallback=function(){this.mRequest=inAppointment.saveToServer(saveCallback.bind(this));}
var getDetachedRecurrencesCallback=function(){this.getRecurrencesFromServer(excAppt,saveExceptionCallback.bind(this));}
if(inAppointment.organizerIsPrincipal()){this.mRequest=excAppt.saveToServer(getDetachedRecurrencesCallback.bind(this));}
else{this.mRequest=inAppointment.saveToServer(saveCallback.bind(this));}
return false;alert('FIXME: handle singleton exceptions');}
Event.observe('appointment_recur_warn_change_nth_dialog_all','click',handleAllEventsClick.bindAsEventListener(this));dialogManager().show('appointment_recur_warn_change_nth_dialog',cancelCallback.bind(this),onlyThisEventCallback.bind(this));}
else if(inAppointment.recurrenceInfo()){if(!$('appointment_recur_warn_change_first_dialog')){dialogManager().drawDialog('appointment_recur_warn_change_first_dialog',['appointment_recur_warn_change_first_dialog_desc'],'appointment_recur_warn_dialog_onlythis');insertAfter(Builder.node('input',{type:'button',id:'appointment_recur_warn_change_first_dialog_allappts',value:Loc.appointment_recur_warn_dialog_all}),'appointment_recur_warn_change_first_dialog_cancel');}
var cancelCallback=function(){Event.stopObserving('appointment_recur_warn_change_first_dialog_allappts');inAppointment.revertToSaved(true);this.drawVisibleAppointments();this.getAppointmentsFromServer();}
var handleAllEventsClick=function(inEvent){Event.stop(inEvent);Event.stopObserving('appointment_recur_warn_change_first_dialog_allappts');this.mRequest=inAppointment.saveToServer(saveCallback.bind(this));dialogManager().hide();return false;}
var onlyThisEventCallback=function(){Event.stopObserving('appointment_recur_warn_change_first_dialog_allappts');var excAppt=inAppointment.detachRecurrence(true,true);excAppt.setRecurrenceFrequency('NONE');if(inAppointment.organizerIsPrincipal()){var savedExceptionCallback=function(){this.mRequest=inAppointment.saveToServer(saveCallback.bind(this));}
this.mRequest=excAppt.saveToServer(savedExceptionCallback.bind(this));}
else{this.mRequest=inAppointment.saveToServer(saveCallback.bind(this));}
return false;}
if(inAppointment.updateStack().length==1&&inAppointment.updateStack()[0]=='RRULE'){this.mRequest=inAppointment.saveToServer(saveCallback.bind(this));return;}
Event.observe('appointment_recur_warn_change_first_dialog_allappts','click',handleAllEventsClick.bindAsEventListener(this));dialogManager().show('appointment_recur_warn_change_first_dialog',cancelCallback.bind(this),onlyThisEventCallback.bind(this));}
else{dialogManager().showProgressMessage('appointment_save_progress');this.mRequest=inAppointment.saveToServer(saveCallback.bind(this));}}
if(inAppointment.isNew()){this.mRequest=inAppointment.saveToServer(saveCallback.bind(this));}
else{inAppointment.fetchFullEventDetails(gotFullFileCallback.bind(this));}},dateRangeToFetch:function(){var range=[new Date(this.mDateNavigation.mSelectedDate.getTime()),new Date(this.mDateNavigation.mSelectedDate.getTime())];if(this.mMonthMode){range[0].setDate(1);range[1].setMonth(range[1].getMonth()+1);range[1].setDate(0);}
else{range[0]=new Date(this.mDateNavigation.mWeekStartDate.getTime());range[1]=new Date(range[0].getTime());range[1].setDate(range[1].getDate()+7);}
range[0].setDate(range[0].getDate()-this.mBufferDays);range[1].setDate(range[1].getDate()+this.mBufferDays);return range;},updateCurrentTime:function(){if($('calendar_grid_month_view').visible())return;var dt=new Date();if((this.mDayMode&&parseInt(dateObjToISO8601(dt))!=parseInt(dateObjToISO8601(this.mDateNavigation.mSelectedDate)))||!compareDateWeeks(dt,this.mDateNavigation.mSelectedDate,this.mDateNavigation.mStartWeekday)){$('current_time_indicator').hide();return;}
var divLeft=$$('#calendar_grid_week_events_columns div.calendar_grid_hours_key')[0].up('li').offsetWidth-18;var divTop=(this.mWeekGridSize[1]*(dt.getHours()+(dt.getMinutes()/60)))-6;$('current_time_indicator').setStyle({display:'',left:divLeft+'px',top:divTop+'px'});},pollForChanges:function(){if(this.mTimer){clearTimeout(this.mTimer);delete this.mTimer;}
if(this.mParentElement.style.display!='none'){this.mPollRequest=this.mRemoteCalendarCollection.updateCalendarCTags(this.gotChangeList.bind(this));this.updateCurrentTime();}},gotChangeList:function(inChangeList){if(inChangeList.shouldFetchCollection){this.mRemoteCalendarCollection.getCalendars();}
else if(inChangeList.length>0||inChangeList.shouldFetchInbox){this.getAppointmentsFromServer();}
else{if(this.mTimer){clearTimeout(this.mTimer);delete this.mTimer;}
this.mTimer=setTimeout(this.pollForChanges.bind(this),this.mRefreshTimeout);}},getAppointmentsFromServer:function(){if(this.mTimer){clearTimeout(this.mTimer);delete this.mTimer;}
if(this.mParentElement.style.display!='none'){var range=this.dateRangeToFetch();this.mGetApptsRequest=this.mRemoteCalendarCollection.getEventsForDateRange(range[0],range[1],this.gotAppointmentsFromServer.bind(this));}},getRecurrencesFromServer:function(inAppointment,inOptCallback){var range=this.dateRangeToFetch();var expandCallback=function(q,r){this.gotAppointmentsFromServer(q,r,inAppointment.valueForProperty('UID'));if(inOptCallback)inOptCallback();}
this.mGetApptsRequest=inAppointment.expandRecurrences(range[0],range[1],expandCallback.bind(this));},gotAppointmentsFromServer:function(inRequestObj,inResponseObj,inOptDeletePrefix){if(inRequestObj==this.mGetApptsRequest){if($('calendar_mask').visible())$('calendar_mask').hide();var animate=this.mAppointments&&gAnimate&&!inOptDeletePrefix;if(!this.mAppointments)this.mAppointments=new Object();var syncStatus=Array.syncKeyedArrayWithRows(this.mAppointments,inResponseObj,['displayNodes'],inOptDeletePrefix);syncStatus.deletedRows.each(function(appt){this.removeAppointment(appt,animate);}.bind(this));this.drawVisibleAppointments(animate);this.getInboxContentsFromServer();if(this.mShowAppointmentUID&&this.mAppointments[this.mShowAppointmentUID]){this.showApptDialog(this.mAppointments[this.mShowAppointmentUID]);delete this.mShowAppointmentUID;}
if(this.mTimer){clearTimeout(this.mTimer);delete this.mTimer;}
this.mTimer=setTimeout(this.pollForChanges.bind(this),this.mRefreshTimeout);dialogManager().hideProgressMessage();publisher().publish('UPDATED_APPOINTMENTS',this);}},getInboxContentsFromServer:function(){this.mGetInboxRequest=this.mRemoteCalendarCollection.getInboxContents(this.gotInboxContentsFromServer.bind(this));},gotInboxContentsFromServer:function(inRequestObj,inResponseObj){var recentResponse=Array.removeDuplicateRows(inResponseObj,function(inEarlier,inLater){var laterIsBetter=parseInt(inLater.valueForProperty('SEQUENCE'))>parseInt(inEarlier.valueForProperty('SEQUENCE'));(laterIsBetter?inEarlier:inLater).deleteFromServer();return laterIsBetter;});var isFirstTime=(!this.mInboxContents);if(isFirstTime)this.mInboxContents=$A([]);var syncStatus=Array.syncKeyedArrayWithRows(this.mInboxContents,recentResponse);var contentElm=$('calendar_sidebar_notifications_content');syncStatus.deletedRows.each(function(calendarEvent){if(calendarEvent.uid&&$('inbox_event_'+calendarEvent.uid))$('inbox_event_'+calendarEvent.uid).remove();});syncStatus.addedRows.each(function(calendarEvent){var method=calendarEvent.mParentCalendarFile.iTIPMethod();var methodString="\u00A0";var organizerString="\u00A0";var buttons=[];if(method=='REPLY'){calendarEvent.deleteFromServer();return false;}
else if(method=='CANCEL'){methodString=Loc.itip_cancelled;buttons=[Builder.node('a',{href:'#',id:'itip_button_confirmcancel'},Loc.ok)];buttons[0].observe('click',function(inEvent){inEvent.stop();var eff=new Effect.BlindUp('inbox_event_'+calendarEvent.uid,{duration:0.25,afterFinish:function(eff){eff.element.remove();}});calendarEvent.deleteFromServer(invalidate);var gotCalendarEventCallback=function(inMatchingCalendarEvent){if(inMatchingCalendarEvent){inMatchingCalendarEvent.deleteFromServer(function(){this.getAppointmentsFromServer()}.bind(this));}}
this.mRemoteCalendarCollection.findEquivalentToInboxCalendarEvent(calendarEvent,gotCalendarEventCallback.bind(this));return false;}.bind(this));}
else if(method=='REQUEST'){organizerString=String.format(Loc.itip_organizer_format,{organizer:calendarEvent.organizer().displayname})
buttons=[Builder.node('a',{href:'#',id:'itip_button_TENTATIVE'},Loc.invitation_dialog_status_TENTATIVE),Builder.node('a',{href:'#',id:'itip_button_ACCEPTED'},Loc.invitation_dialog_status_ACCEPTED),Builder.node('a',{href:'#',id:'itip_button_DECLINED'},Loc.invitation_dialog_status_DECLINED)];buttons.invoke('observe','click',function(inEvent){inEvent.stop();var clickedStatus=inEvent.findElement('a').id.match(/itip_button_(.+)$/)[1];dialogManager().showProgressMessage('appointment_save_progress');var cleanupAfterSave=function(){dialogManager().hideProgressMessage();var eff=new Effect.BlindUp('inbox_event_'+calendarEvent.uid,{duration:0.25,afterFinish:function(eff){eff.element.remove();}});this.getAppointmentsFromServer();}
var gotCalendarEventCallback=function(inMatchingCalendarEvent){if(inMatchingCalendarEvent){inMatchingCalendarEvent.setParticipantStatus(clickedStatus);inMatchingCalendarEvent.saveToServer(function(){calendarEvent.deleteFromServer(cleanupAfterSave.bind(this));}.bind(this));}
else{calendarEvent.deleteFromServer(cleanupAfterSave.bind(this));}}
this.mRemoteCalendarCollection.findEquivalentToInboxCalendarEvent(calendarEvent,gotCalendarEventCallback.bind(this));return false;}.bind(this));}
var li=Builder.node('li',{className:'inbox_event',id:'inbox_event_'+calendarEvent.uid},[Builder.node('div',{className:'inbox_event_summary'},(calendarEvent.summary()||"\u00A0")),Builder.node('div',{className:'inbox_event_organizer',style:(organizerString=="\u00A0"?'display:none':'')},organizerString),Builder.node('div',{className:'inbox_event_dtstart'},Loc.getLongDateString(calendarEvent.startDate())),Builder.node('div',{className:'inbox_event_itip',style:(methodString=="\u00A0"?'display:none':'')},methodString),Builder.node('div',{className:'inbox_event_buttons'},buttons),Builder.node('div',{className:'inbox_event_footer'})]);li.observe('click',function(inEvent){if(Position.within(li.down('div.inbox_event_buttons'),inEvent.pointerX(),inEvent.pointerY()))return;inEvent.stop();this.mDateNavigation.setSelectedDate(calendarEvent.startDate());var showOverAppointment=this.mAppointments[calendarEvent.uid];if(showOverAppointment){var showOverElement=li;if(showOverAppointment.displayNodes.length>0&&showOverAppointment.displayNodes[0].element){showOverElement=showOverAppointment.displayNodes[0].element;}
this.showApptDialog(this.mAppointments[calendarEvent.uid],showOverElement);}
else{this.mShowAppointmentUID=calendarEvent.uid;}
if(!this.hasNotifications())this.hideNotificationsBadge();}.bindAsEventListener(this));insertAtBeginning(li,contentElm);},this);if(this.hasNotifications()){this.showNotificationsBadge();if(isFirstTime)this.showNotifications();}
else{this.hideNotificationsBadge();}
this.updateAvailableTimeShading();},hasNotifications:function(){return($('calendar_sidebar_notifications').getElementsBySelector('li.inbox_event').length>0);},showNotificationsBadge:function(){$('calendar_sidebar_toolbar_tab_notifications').addClassName('hasNotifications');},hideNotificationsBadge:function(){$('calendar_sidebar_toolbar_tab_notifications').removeClassName('hasNotifications');},snapSidebarSplitter:function(){if(!this.mNotificationsSplitView)return;this.mNotificationsSplitView.mMaximumHeight=$('calendar_splitter_parent').offsetHeight;if($('calendar_grid_sidebar_splitter').visible()){this.mNotificationsSplitView.mMaximumHeight-=$('calendar_grid_sidebar_splitter').offsetHeight+this.mCachedNiftyDateHeight||180;}
else{this.mCachedNiftyDateHeight=$('calendar_grid_splitter_sibling').offsetHeight;this.mNotificationsSplitView.mMaximumHeight-=this.mCachedNiftyDateHeight;}
$('calendar_collection_list').style.height=(this.mNotificationsSplitView.mMaximumHeight)+'px';},showDatePicker:function(){$('calendar_sidebar_notifications').hide();$('calendar_date_picker').show();$('calendar_grid_sidebar_splitter').hide();this.snapSidebarSplitter();this.setSelectedChild('calendar_sidebar_toolbar_tab_date');},showNotifications:function(){$('calendar_date_picker').hide();$('calendar_sidebar_notifications').show();$('calendar_grid_sidebar_splitter').show();this.snapSidebarSplitter();this.mNotificationsSplitView.mDuringCallback();this.setSelectedChild('calendar_sidebar_toolbar_tab_notifications');},setSelectedChild:function(inElementId){var inElement=$(inElementId);if(!inElement)return;var parent=inElement.up('ul');if(parent){var selectedChild=parent.down('.selected');if(selectedChild)selectedChild.removeClassName('selected');var selectedParent=parent.down('.selectedparent');if(selectedParent)selectedParent.removeClassName('selectedparent');}
inElement.addClassName('selected');var inElementParent=inElement.parentNode;if(inElementParent&&(inElementParent.nodeName.toLowerCase()=='li'))
inElementParent.addClassName('selectedparent');},startDrag:function(){Position.prepare();this.mGetApptsRequest=null;if(this.mTimer){clearTimeout(this.mTimer);delete this.mTimer;}
tooltipManager().hide(false);var timerFunction=function(){delete this.mDragTimer;};this.mDragTimer=setTimeout(timerFunction.bind(this),gDoubleClickDelay);tooltipManager().mEnabled=false;},endDrag:function(inDraw){if(inDraw)this.drawVisibleAppointments(false);tooltipManager().mEnabled=true;},drawAppointment:function(inAppointment,inAnimate){var isMonthView=Element.visible('calendar_grid_month_view');if(inAppointment.uid){this.updateRectsForAppointment(inAppointment);for(var currentNodeIdx=0;currentNodeIdx<inAppointment.displayNodes.length;currentNodeIdx++){var currentNode=inAppointment.displayNodes[currentNodeIdx];if(currentNode.rect&&currentNode.overlaps&&currentNode.overlaps.index>=this.mMonthBannerLimit&&isMonthView){delete currentNode.rect;}
if(currentNode.rect){if(currentNode.overlaps&&(inAppointment.banner()||isMonthView)){currentNode.rect[1]+=(currentNode.rect[3]+2)*currentNode.overlaps.index;}
else if(currentNode.overlaps){currentNode.rect[0]+=currentNode.rect[2]*currentNode.overlaps.index/currentNode.overlaps.total;currentNode.rect[2]=currentNode.rect[2]/currentNode.overlaps.total;}
var apptDiv=currentNode.element;if(!apptDiv){var contentLink=Builder.node('div',{className:(inAppointment.banner()?'calendar_banner_content':'calendar_appointment_content')},[Builder.node('div',{className:'calendar_appointment_attendeestatus calendar_appointment_attendeestatus_none'}),Builder.node('span')]);var resizeHandle=Builder.node('div',{className:inAppointment.banner()?'calendar_banner_resizehandle':'calendar_appointment_resizehandle'});var apptDivStyle='position:absolute';apptDiv=Builder.node(isMonthView&&!inAppointment.banner()?'p':'div',{className:inAppointment.isNew()?'temporary_calendar_appointment':'calendar_appointment',style:apptDivStyle,id:'appointment_div_'+inAppointment.uid+'_'+currentNodeIdx},[contentLink,resizeHandle]);if(isMonthView&&!inAppointment.banner()){Element.addClassName(apptDiv,'month_view_appointment');}
else if(isMonthView){apptDiv.addClassName('calendar_month_banner');}
apptDiv.onselectstart=invalidate;contentLink.onclick=invalidate;contentLink.onmousedown=invalidate;resizeHandle.onmousedown=invalidate;if(isMonthView||inAppointment.banner()){Event.observe(contentLink,'mousedown',this.handleMouseDownInBannerAppointment);Event.observe(resizeHandle,'mousedown',this.handleMouseDownInBannerAppointment);}
else{Event.observe(contentLink,'mousedown',this.handleMouseDownInWeekTimedAppointment);Event.observe(resizeHandle,'mousedown',this.handleMouseDownInWeekTimedAppointment);}}
else if(!isMonthView){if(inAppointment.banner()&&(apptDiv.parentNode==$('calendar_grid_week_events_content'))){Element.remove(apptDiv);$('calendar_grid_week_banners_content').appendChild(apptDiv);Event.stopObserving(apptDiv.firstChild,'mousedown',this.handleMouseDownInWeekTimedAppointment);Event.stopObserving(apptDiv.lastChild,'mousedown',this.handleMouseDownInWeekTimedAppointment);Event.observe(apptDiv.firstChild,'mousedown',this.handleMouseDownInBannerAppointment);Event.observe(apptDiv.lastChild,'mousedown',this.handleMouseDownInBannerAppointment);}
else if((!inAppointment.banner())&&(apptDiv.parentNode==$('calendar_grid_week_banners_content'))){Element.remove(apptDiv);$('calendar_grid_week_events_content').appendChild(apptDiv);Event.stopObserving(apptDiv.firstChild,'mousedown',this.handleMouseDownInBannerAppointment);Event.stopObserving(apptDiv.lastChild,'mousedown',this.handleMouseDownInBannerAppointment);Event.observe(apptDiv.firstChild,'mousedown',this.handleMouseDownInWeekTimedAppointment);Event.observe(apptDiv.lastChild,'mousedown',this.handleMouseDownInWeekTimedAppointment);}}
if(apptDiv&&(!inAppointment.isNew())&&(!isMonthView||inAppointment.banner())){apptDiv.setStyle({backgroundColor:(isMonthView?inAppointment.color():inAppointment.fillColor()),borderColor:inAppointment.color(),color:(isMonthView?'#FFF':inAppointment.textColor())});var overallAttendeeStatus=inAppointment.overallAttendeeStatus();var statusDiv=apptDiv.down('div.calendar_appointment_attendeestatus');if(overallAttendeeStatus&&statusDiv&&inAppointment.organizerIsPrincipal()){overallAttendeeStatus=overallAttendeeStatus.toLowerCase().replace(/[^a-z]/,'');statusDiv.className='calendar_appointment_attendeestatus calendar_appointment_attendeestatus_'+overallAttendeeStatus;}}
if(inAppointment.participantStatus()=='NEEDS-ACTION'){Element.addClassName(apptDiv,'calendar_appointment_needsaction');}
else{Element.removeClassName(apptDiv,'calendar_appointment_needsaction');}
var oldBounds=styleBoundsForDiv(apptDiv);if(!inAnimate)Element.addClassName(apptDiv,'calendar_appointment_noanimate');apptDiv.style.left=currentNode.rect[0]+'px';apptDiv.style.top=currentNode.rect[1]+'px';apptDiv.style.width=currentNode.rect[2]+'px';apptDiv.style.height=currentNode.rect[3]+'px';apptDiv.firstChild.style.height=(parseInt(apptDiv.style.height)-this.mResizeHandleHeight)+'px';var summaryToDisplay=inAppointment.summary()||'-';if(isMonthView&&(!inAppointment.banner())){summaryToDisplay='• '+summaryToDisplay;apptDiv.style.color=inAppointment.color();}
apptDiv.firstChild.tooltipElement='appointment_tooltip';apptDiv.firstChild.tooltipValues=inAppointment;replaceElementContents(apptDiv.down('span'),summaryToDisplay);apptDiv.style.fontSize=(!inAppointment.banner()&&!isMonthView&&parseInt(apptDiv.style.height)<=this.mMinimumDisplayHeight?'9px':'');if(!inAppointment.banner()&&!isMonthView&&apptDiv.down('div.calendar_appointment_attendeestatus_none')){Element.removeClassName(apptDiv,'calendar_appointment_has_attendeestatus');}
else{Element.addClassName(apptDiv,'calendar_appointment_has_attendeestatus');}
if(!currentNode.element){tooltipManager().observe(apptDiv.firstChild);if(inAnimate)apptDiv.style.opacity='0';if(isMonthView){$('calendar_grid_month_content').appendChild(apptDiv);}
else{(inAppointment.banner()?$('calendar_grid_week_banners_content'):$('calendar_grid_week_events_content')).appendChild(apptDiv);}
currentNode.element=apptDiv;if(inAnimate)apptDiv.style.opacity='';}
currentNode.element.style.visibility='';}
else if(currentNode.element){Event.stopObserving(currentNode.element.firstChild,'mousedown',this.handleMouseDownInWeekTimedAppointment);Event.stopObserving(currentNode.element.lastChild,'mousedown',this.handleMouseDownInWeekTimedAppointment);Event.stopObserving(currentNode.element.firstChild,'mousedown',this.handleMouseDownInBannerAppointment);Event.stopObserving(currentNode.element.lastChild,'mousedown',this.handleMouseDownInBannerAppointment);tooltipManager().stopObserving(currentNode.element.firstChild);currentNode.element.onselectstart=null;var deleteElement=function(){if(currentNode.element){if(currentNode.element.parentNode)Element.remove(currentNode.element);}
currentNode.element=null;}
if(inAnimate){if(!this.mCleanupCallbacks)this.mCleanupCallbacks=$A([]);currentNode.element.style.opacity='0';this.mCleanupCallbacks.push(deleteElement.bind(this));}
else{deleteElement();}}}}},removeAppointment:function(inAppointment,inAnimate){if(this.mAppointments[inAppointment.uid])delete this.mAppointments[inAppointment.uid];inAppointment.setVisible(false);this.drawAppointment(inAppointment,inAnimate);},drawVisibleAppointments:function(inAnimate){this.updateCurrentTime();if(this.mAppointments){this.mBannerCounts=new Object();var apptsToDeleteOverlaps=$H(this.mAppointments).values();for(var currentApptIdx=0;currentApptIdx<apptsToDeleteOverlaps.length;currentApptIdx++){var currentAppt=apptsToDeleteOverlaps[currentApptIdx];if(currentAppt.displayNodes){for(var currentNodeIdx=0;currentNodeIdx<currentAppt.displayNodes.length;currentNodeIdx++){var currentNode=currentAppt.displayNodes[currentNodeIdx];if(currentNode.overlaps)delete currentNode.overlaps;}}}
this.mMonthBannerLimit=Math.floor((this.mMonthGridSize[1]-this.mMonthBannerHeight)/(this.mMonthBannerHeight+3));var scannedNodes=new Object();var isMonthView=Element.visible('calendar_grid_month_view');var apptsToCalculateOverlaps=$H(this.mAppointments).values();apptsToCalculateOverlaps.invoke('startDate',true);apptsToCalculateOverlaps=Array.sortArrayUsingKey(apptsToCalculateOverlaps,'mCachedStartDate');for(var currentApptIdx=0;currentApptIdx<apptsToCalculateOverlaps.length;currentApptIdx++){var currentAppt=apptsToCalculateOverlaps[currentApptIdx];if(currentAppt.startDate()){var bannerStartDateInt=parseInt(currentAppt.startDate(true));var bannerEndDateInt=Math.max(parseInt(currentAppt.endDate(true)),bannerStartDateInt+1);for(var bannerCountIdx=bannerStartDateInt;bannerCountIdx<bannerEndDateInt;bannerCountIdx++){if(!this.mBannerCounts[''+bannerCountIdx])this.mBannerCounts[''+bannerCountIdx]=0;this.mBannerCounts[''+bannerCountIdx]++;}}
var sectionAxis=isMonthView||currentAppt.banner()?1:0;var overlapAxis=(sectionAxis+1)%2;this.updateRectsForAppointment(currentAppt);for(var currentNodeIdx=0;currentNodeIdx<currentAppt.displayNodes.length;currentNodeIdx++){var currentNode=currentAppt.displayNodes[currentNodeIdx];if(currentNode.rect){var sectionName=sectionAxis+'_'+currentNode.rect[sectionAxis];if(!scannedNodes[sectionName])scannedNodes[sectionName]=[];for(var otherNodeIdx=0;otherNodeIdx<scannedNodes[sectionName].length;otherNodeIdx++){var otherNode=scannedNodes[sectionName][otherNodeIdx];var highestBeginning=Math.max(otherNode.rect[overlapAxis],currentNode.rect[overlapAxis]);var lowestEnding=Math.min((otherNode.rect[overlapAxis]+otherNode.rect[overlapAxis+2]),(currentNode.rect[overlapAxis]+currentNode.rect[overlapAxis+2]));if(highestBeginning<lowestEnding){otherNode.overlaps=otherNode.overlaps||{index:0,total:1};otherNode.overlaps.total++;currentNode.overlaps={index:otherNode.overlaps.index+1,total:otherNode.overlaps.total};}}
scannedNodes[sectionName].push(currentNode);}}}
if(Element.visible('calendar_grid_month_view')){$A(d.getElementsByClassName('calendar_grid_month_day')).each(function(elm){if(elm.id){var bc=this.mBannerCounts[elm.id.match(/\d{8}/)[0]];if(!bc)bc=0;var a=elm.down('a');if(!a){a=Builder.node('a',{href:'#'});a.onclick=this.handleMonthMoreButtonClick;elm.appendChild(a);}
replaceElementContents(a,String.format(Loc.more_link_format,{count:bc}));a.style.display=(bc>this.mMonthBannerLimit?'':'none');}}.bind(this));}
var apptsToDraw=$H(this.mAppointments).values();for(var currentApptIdx=0;currentApptIdx<apptsToDraw.length;currentApptIdx++){this.drawAppointment(apptsToDraw[currentApptIdx],inAnimate);}
if(this.mCleanupCallbacks){setTimeout(function(){if(!this.mCleanupCallbacks)return;this.mCleanupCallbacks.each(function(cb){cb();});delete this.mCleanupCallbacks;}.bind(this),this.mCleanupTimeout);}
setTimeout(function(){$$('div.calendar_appointment_noanimate').invoke('removeClassName','calendar_appointment_noanimate')},10);}},updateRectsForAppointment:function(inAppointment,inOptRecursion){var isMonthView=Element.visible('calendar_grid_month_view');var recursion=inOptRecursion||0;var startDate=inAppointment.startDate();var duration=inAppointment.duration();if(recursion==0){inAppointment.displayNodes=inAppointment.displayNodes||$A([]);for(var currentNodeIdx=0;currentNodeIdx<inAppointment.displayNodes.length;currentNodeIdx++){inAppointment.displayNodes[currentNodeIdx].rect=null;}}
if(!startDate||!inAppointment.visible())return false;if(inAppointment.participantStatus()=='DECLINED')return false;if(inAppointment.mParentCalendarFile.iTIPMethod()=='CANCEL')return false;if(this.mDayMode&&inAppointment.banner()&&recursion>0)return false;if(recursion==0)inAppointment.time_string=Loc.getTimeRangeDisplayString(startDate,duration);if(inAppointment.banner()||isMonthView){var days=duration.days||0;for(var i=0;i<recursion;i++){startDate.setDate(startDate.getDate()+inAppointment.displayNodes[i].days);days-=inAppointment.displayNodes[i].days;}
var maxDays=(7-(startDate.getDay()-this.mDateNavigation.mStartWeekday));if(maxDays>7)maxDays%=7;days=Math.min(days,maxDays);if(recursion==0&&(!inAppointment.banner()))days=Math.max(days,1);if(days<=0)return false;if(this.mDayMode&&inAppointment.banner()){var today=this.mDateNavigation.mSelectedDate;var endDate=new Date(startDate.getTime());endDate.setDate(endDate.getDate()+duration.days);if((today-startDate)<0)return false;if((today-endDate)>0)return false;}
var rect=null;var prefix=isMonthView?'calendar_grid_month_day_':'calendar_grid_week_banner_slot_';var selectedDateElement=$('calendar_grid_week_banner_slot_'+parseInt(dateObjToISO8601(this.mDateNavigation.mSelectedDate)));var startElement=(this.mDayMode?selectedDateElement:$(prefix+parseInt(dateObjToISO8601(startDate))));var endDate=getEndDateUsingDuration(startDate,{days:days-1});var endElement=(this.mDayMode?selectedDateElement:$(prefix+parseInt(dateObjToISO8601(endDate))));if(startElement&&endElement){var startOffsetElement=IEFixes.isIE?(isMonthView?startElement.parentNode.parentNode:startElement.parentNode):startElement;var endOffsetElement=IEFixes.isIE?(isMonthView?endElement.parentNode.parentNode:endElement.parentNode):endElement;rect=[startOffsetElement.offsetLeft,startElement.offsetTop,50,this[isMonthView?'mMonthBannerHeight':'mBannerHeight']];if(isMonthView)rect[1]+=this.mMonthBannerHeight+2;rect[2]=endOffsetElement.offsetLeft+endElement.offsetWidth-rect[0]+this.mWeekEventElementOffsets[2];if(this.mDayMode)rect[2]--;}
if(inAppointment.displayNodes.length<=recursion)inAppointment.displayNodes[recursion]=new Object();Object.extend(inAppointment.displayNodes[recursion],{days:days,rect:rect});}
else{var hours=duration.hours||0;if(duration.days)hours+=(duration.days*24);if(duration.minutes)hours+=(duration.minutes/60);for(var i=0;i<recursion;i++){startDate.setDate(startDate.getDate()+1);startDate.setHours(0);startDate.setMinutes(0);startDate.setSeconds(0);hours-=inAppointment.displayNodes[i].hours;}
hours=Math.min(hours,24-startDate.getHours()-(startDate.getMinutes()/60));if(hours<=0)return false;var rect=null;if(compareDateWeeks(startDate,this.mDateNavigation.mSelectedDate,this.mDateNavigation.mStartWeekday)&&(!this.mDayMode||(parseInt(dateObjToISO8601(startDate,false))==parseInt(dateObjToISO8601(this.mDateNavigation.mSelectedDate,false,false))))){var columnNum=(startDate.getDay()-this.mDateNavigation.mStartWeekday);if(columnNum<0)columnNum=7+columnNum;var cloneElm=$$('#calendar_grid_week_events_columns .calendar_grid_week_column_'+columnNum+' .calendar_grid_week_row_'+startDate.getHours())[0];hours=Math.max(hours,0.25);var rect=[cloneElm.offsetLeft,cloneElm.offsetTop+((startDate.getMinutes()/60)*this.mWeekGridSize[1]),cloneElm.offsetWidth,Math.max(hours*this.mWeekGridSize[1],this.mMinimumDisplayHeight)];this.mWeekEventElementOffsets.each(function(offset,i){rect[i]+=offset;});if(IEFixes.isIE)rect[0]+=cloneElm.parentNode.offsetLeft;}
if(inAppointment.displayNodes.length<=recursion)inAppointment.displayNodes[recursion]=new Object();Object.extend(inAppointment.displayNodes[recursion],{hours:hours,rect:rect});}
this.updateRectsForAppointment(inAppointment,++recursion);return true;},updateAvailableTimeShading:function(){var availability=this.mRemoteCalendarCollection&&this.mRemoteCalendarCollection.mAvailability;if(availability){var startDate=availability.startDate();var morningHeight=(startDate.getHours()+(startDate.getMinutes()/60))*this.mWeekGridSize[1];$('calendar_grid_week_unavailable_morning').style.height=morningHeight+'px';var endDate=availability.endDate();var eveningStart=(endDate.getHours()+(endDate.getMinutes()/60))*this.mWeekGridSize[1];$('calendar_grid_week_unavailable_evening').style.top=eveningStart+'px';$('calendar_grid_week_unavailable_evening').setStyle({top:eveningStart+'px',height:(Element.getHeight('calendar_grid_week_events_content')-eveningStart)+'px'});}
$$('#calendar_grid_week_events .calendar_grid_week_unavailable').invoke(availability?'show':'hide');}}
function niftyDateHack(inMessage,inObject,inUserInfo)
{if(!inObject)return;var dt=new Date(inObject.mShownDate.getTime());dt.setMonth(dt.getMonth()+1);inObject.setShownDate(dt);dt.setMonth(dt.getMonth()-1);inObject.setShownDate(dt);}
function removeTime(inDate){if(!inDate)return;var indexT=inDate.indexOf('T');if(indexT>0)return inDate.substr(0,indexT);else return inDate;}
function getHoursForDuration(inDuration){var hours=inDuration.hours||0;if(inDuration.minutes)hours+=(inDuration.minutes/60);if(inDuration.days)hours+=(inDuration.days*24);return(hours==0?null:hours);}
function getDurationForHours(inHours){var duration={hours:Math.floor(inHours)};var r=inHours-duration.hours;if(r>0)duration.minutes=Math.floor(60*r);return duration;}
if(window.loaded)loaded('calaccess.js');

/* caldav.js */

var RemoteTimezoneService=Class.createWithSharedInstance('timezoneService');RemoteTimezoneService.prototype={initialize:function(){this.mTZIDs=$A([]);this.mOffsetData={};},getTimezoneList:function(inCallback){if(inCallback&&this.mTZIDs&&this.mTZIDs.length>0)inCallback(this.mTZIDs);var callback=function(transport){if(!transport.responseXML){reportError('Report response is missing responseXML. responseText = '+transport.responseText||'');return false;}
this.mTZIDs=Element.childrenWithNodeName(Element.firstChildWithNodeName(transport.responseXML,'tzids'),'tzid').collect(function(tzid){return Element.firstNodeValue(tzid);});if(inCallback)inCallback(this.mTZIDs);}
return new Ajax.CalendarRequest('/timezones?method=list',{method:'post',onSuccess:callback.bind(this),onException:reportError,errorNotificationObject:this});},fetchCurrentTimezoneString:function(inCallback){if(this.mCurrentTimezoneString){if(inCallback)inCallback(this.mCurrentTimezoneString,this.mCurrentTimezoneData);return null;}
var gotTimezoneCallback=function(transport){var tempCalendarFile=new CalendarFile(transport.responseText);this.mCurrentTimezoneData=tempCalendarFile.mCalendarObj.VCALENDAR[0].VTIMEZONE[0];this.mCurrentTimezoneString='BEGIN:VTIMEZONE\n'
+tempCalendarFile.updatedCalendarText(this.mCurrentTimezoneData)
+'\nEND:VTIMEZONE\n';if(inCallback)inCallback(this.mCurrentTimezoneString,this.mCurrentTimezoneData);}
return new Ajax.CalendarRequest('/timezones?method=get&tzid='+encodeURIComponent(this.selectedTimezone()),{method:'post',onSuccess:gotTimezoneCallback.bind(this),onException:reportError,errorNotificationObject:this});},fetchOffsetsForDateRange:function(inCallback,inStartDate,inEndDate,inOptTZID){var tzid=inOptTZID||this.selectedTimezone();var performFetch=function(st,en){var fetchCallback=function(transport){if(!transport.responseXML){reportError('Report response is missing responseXML. responseText = '+transport.responseText||'');return false;}
var observances=Element.childrenWithNodeName(Element.firstChildWithNodeName(transport.responseXML,'tzdata'),'observance');for(var observanceIdx=0;observanceIdx<observances.length;observanceIdx++){var observance=observances[observanceIdx];this.mOffsetData[tzid].offsets.push({startDate:parseInt(Element.firstNodeValue(Element.firstChildWithNodeName(observance,'onset'))),offset:parseFloat(Element.firstNodeValue(Element.firstChildWithNodeName(observance,'utc-offset')))});}
this.mOffsetData[tzid].offsets=this.mOffsetData[tzid].offsets.sortBy(function(offset){return offset.startDate;});if(inCallback)inCallback(this.mOffsetData[tzid]);}
return new Ajax.CalendarRequest('/timezones?method=expand&tzid='
+encodeURIComponent(tzid)
+'&start='+dateObjToISO8601(st)
+'&end='+dateObjToISO8601(en),{method:'post',onSuccess:fetchCallback.bind(this),onException:reportError,on404:function(){if(tzid==this.selectedTimezone()){if(!publisher().publish('ERROR_FROM_SERVER',this,{errorObj:{status:'404'}}))reportError('Selected timezone not found.');return;}
this.fetchOffsetsForDateRange(inCallback,inStartDate,inEndDate);}.bind(this),errorNotificationObject:this});}.bind(this);if(!this.mOffsetData[tzid]){this.mOffsetData[tzid]={startDate:new Date(),endDate:new Date(),offsets:$A([])};this.mOffsetData[tzid].startDate.setFullYear(this.mOffsetData[tzid].startDate.getFullYear()-5);this.mOffsetData[tzid].endDate.setFullYear(this.mOffsetData[tzid].endDate.getFullYear()+5);return performFetch(this.mOffsetData[tzid].startDate,this.mOffsetData[tzid].endDate);}
else if(inStartDate<this.mOffsetData[tzid].startDate&&inEndDate>this.mOffsetData[tzid].endDate){this.mOffsetData[tzid].startDate=inStartDate;this.mOffsetData[tzid].endDate=inEndDate;return performFetch(inStartDate,inEndDate);}
else if(inStartDate<this.mOffsetData[tzid].startDate){var req=performFetch(inStartDate,this.mOffsetData[tzid].startDate);this.mOffsetData[tzid].startDate=inStartDate;return req;}
else if(inEndDate>this.mOffsetData[tzid].endDate){var req=performFetch(this.mOffsetData[tzid].endDate,inEndDate);this.mOffsetData[tzid].endDate=inEndDate;return req;}
if(inCallback)inCallback(this.mOffsetData[tzid]);return null;},fetchOffsetsForEvents:function(inCallback,inEvents,inOptStartDate,inOptEndDate){if(!inEvents||inEvents.length<1){if(inCallback)inCallback();return false;}
var smallestDate=inOptStartDate||createDateObjFromISO8601(''+(parseInt(inEvents.invoke('startDate',true,true).sort()[0])-1));var largestDate=inOptEndDate||createDateObjFromISO8601(''+(parseInt(inEvents.invoke('endDate',true,true).sort().last())+1));var tzids=inEvents.invoke('allReferencedTZIDs').flatten().uniq().without(this.selectedTimezone());var gotTimezoneOffsetsCallback=function(){if(tzids.length<=0){if(inCallback)inCallback();return;}
this.fetchOffsetsForDateRange(gotTimezoneOffsetsCallback.bind(this),smallestDate,largestDate,tzids.pop());}
this.fetchOffsetsForDateRange(gotTimezoneOffsetsCallback.bind(this),smallestDate,largestDate);},selectedTimezone:function(){var results=document.cookie.match(/TZID=([^;]+)/);if(results)return results[1];results=getMetaTagValue('tzid');if(results)return results;return'US/Pacific';},setSelectedTimezone:function(inTZID,inCallback){this.mCurrentTimezoneString=null;this.mCurrentTimezoneData=null;var expireDate=new Date();expireDate.setFullYear(expireDate.getFullYear()+5);document.cookie='TZID='+escape(inTZID)+'; path=/; expires='+expireDate.toGMTString();this.fetchCurrentTimezoneString(inCallback);},findOffsetForTimezone:function(inTZID,inDate){var dtInt=parseInt(dateObjToISO8601(inDate));var offsetSearch=function(offset){return offset.startDate<=dtInt;}
return this.mOffsetData[inTZID].offsets.findAll(offsetSearch).last();},correctDateForTimezone:function(inDateObjOrString,inEventTZID,inOptReturnGMT){var wasISO=(inDateObjOrString.constructor==String||inDateObjOrString.constructor==Number);var dt=(wasISO?createDateObjFromISO8601(''+inDateObjOrString):new Date(inDateObjOrString.getTime()));if(gDebug&&(!this.mOffsetData||((!wasISO||!(''+inDateObjOrString).match(/Z$/))&&!this.mOffsetData[inEventTZID]))){debugger;}
var oldOffset=(wasISO&&(''+inDateObjOrString).match(/Z$/)?{offset:0}:this.findOffsetForTimezone(inEventTZID,dt));var newOffset={offset:0};if(!inOptReturnGMT)newOffset=this.findOffsetForTimezone(this.selectedTimezone(),dt);if(oldOffset&&newOffset)dt.setHours(dt.getHours()-(oldOffset.offset-newOffset.offset)/100);return(wasISO?dateObjToISO8601(dt,false,inOptReturnGMT):dt);}}
var RemotePrincipalService=Class.createWithSharedInstance('principalService');RemotePrincipalService.prototype={mDefaultStartWeekday:0,initialize:function(){var metaPrincipalLoc=getMetaTagValue('caldav_principal_path');if(metaPrincipalLoc)this.setUserPrincipal(metaPrincipalLoc);},setUserPrincipal:function(inURL,inOptPrincipalInfo){this.mUserPrincipalURL=inURL;this.mUserPrincipalInfo=inOptPrincipalInfo;},getPrincipalInfo:function(inCallback){if(this.mUserPrincipalInfo){if(inCallback)inCallback(this.mUserPrincipalInfo);return;}
var reportTxt='<?xml version="1.0" encoding="utf-8" ?>\n'
+'<D:propfind xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">\n'
+' <D:prop><D:displayname/><C:calendar-home-set/><C:calendar-user-address-set/><C:schedule-inbox-URL/><C:schedule-outbox-URL/><C:calendar-user-type/></D:prop>\n'
+'</D:propfind>';var callback=function(transport){if(!transport.responseXML){debug_message('Report response is missing responseXML. responseText = '+transport.responseText||'');return false;}
var validProp=Element.childrenWithNodeName(Element.elementWithSimpleXPath(transport.responseXML,'multistatus.response'),'propstat').detect(function(propstat){return Element.firstNodeValue(Element.firstChildWithNodeName(propstat,'status')).match(/\s200\s/);});if(validProp){var displayname=Element.elementWithSimpleXPath(validProp,'prop.displayname');var calendarhome=Element.elementWithSimpleXPath(validProp,'prop.calendar-home-set.href');if(!calendarhome){if(!publisher().publish('ERROR_FROM_SERVER',this,{errorObj:{status:'404'}}))reportError('Principal is not allowed a calendar');return;}
var inboxurl=Element.elementWithSimpleXPath(validProp,'prop.schedule-inbox-URL.href');var outboxurl=Element.elementWithSimpleXPath(validProp,'prop.schedule-outbox-URL.href');var calendarUserType=Element.elementWithSimpleXPath(validProp,'prop.calendar-user-type');var calendarUserAddressSet=Element.childrenWithNodeName(Element.elementWithSimpleXPath(validProp,'prop.calendar-user-address-set'),'href').collect(function(hrefElm){return Element.firstNodeValue(hrefElm);});if(displayname&&calendarhome){this.mUserPrincipalInfo={href:this.mUserPrincipalURL,uid:this.mUserPrincipalURL,url:Element.firstNodeValue(calendarhome),displayname:Element.firstNodeValue(displayname),inboxurl:Element.firstNodeValue(inboxurl),outboxurl:Element.firstNodeValue(outboxurl),calendarUserType:Element.firstNodeValue(calendarUserType),calendarUserAddressSet:calendarUserAddressSet};}}
if(inCallback)inCallback(this.mUserPrincipalInfo);}
return new Ajax.CalendarRequest(String.addSlash(this.mUserPrincipalURL),{method:'propfind',contentType:'text/xml',postBody:reportTxt,requestHeaders:{Depth:'0'},onSuccess:callback.bind(this),onException:reportError,errorNotificationObject:this});},iCalSubscriptionURLPrefix:function(){var hrefUrl=this.mUserPrincipalInfo.calendarUserAddressSet.detect(function(href){return href.match(/^https*:\/\/[^\/]+\//)});if(!hrefUrl)return'';var schemeAdjustedURL=hrefUrl.match(/^https*:\/\/[^\/]+\//)[0].replace(/^https?:/,'webcal:');var portAdjustedURL=schemeAdjustedURL.replace(/:[\d]+\//,':8008/');return portAdjustedURL;},principalToCalendarUserTypeMap:{'users':'INDIVIDUAL','locations':'ROOM','groups':'GROUP','resources':'RESOURCE'},getMatchingUsers:function(inCallback,inSearchString,inSearchTypes){if(!inSearchString||!inSearchString.match(/\S/)){inCallback($A([]));return false;}
var reportTxt='<?xml version="1.0" encoding="utf-8" ?>\n'
+'<D:principal-property-search xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">\n'
+' <D:property-search>\n'
+'  <D:prop><D:displayname/></D:prop>\n'
+'  <D:match match-type="starts-with">%(q)s</D:match>\n'
+' </D:property-search>\n'
+' <D:property-search>\n'
+'  <D:prop><D:email-address-set/></D:prop>\n'
+'  <D:match match-type="starts-with">%(q)s</D:match>\n'
+' </D:property-search>\n'
+' <D:property-search>\n'
+'  <D:prop><D:first-name/></D:prop>\n'
+'  <D:match match-type="starts-with">%(q)s</D:match>\n'
+' </D:property-search>\n'
+' <D:property-search>\n'
+'  <D:prop><D:last-name/></D:prop>\n'
+'  <D:match match-type="starts-with">%(q)s</D:match>\n'
+' </D:property-search>\n'
+' <D:prop>\n'
+'  <D:email-address-set/><D:displayname/><D:first-name/><D:last-name/><C:calendar-user-type/><C:calendar-home-set/>\n'
+'</D:prop>\n'
+'</D:principal-property-search>';reportTxt=String.format(reportTxt,{q:inSearchString.escapeHTML()});var callback=function(transport){if(!transport.responseXML){debug_message('Report response is missing responseXML. responseText = '+transport.responseText||'');return false;}
var wantedCalUserTypes=inSearchTypes.collect(function(el){return this.principalToCalendarUserTypeMap[el];}.bind(this)).compact();var matchingUsers=$A([]);var responseNodes=Element.childrenWithNodeName(Element.firstChildWithNodeName(transport.responseXML,'multistatus'),'response');for(var responseNodeIdx=0;responseNodeIdx<responseNodes.length;responseNodeIdx++){var responseNode=responseNodes[responseNodeIdx];var href=Element.firstChildWithNodeName(responseNode,'href').firstChild.nodeValue;var statusElm=Element.elementWithSimpleXPath(responseNode,'propstat.status');if(statusElm&&statusElm.firstChild&&statusElm.firstChild.nodeValue&&statusElm.firstChild.nodeValue.match(/\s200\sOK\s*$/)){var displayname=Element.elementWithSimpleXPath(responseNode,'propstat.prop.displayname');var usertype=Element.elementWithSimpleXPath(responseNode,'propstat.prop.calendar-user-type');var calendarhome=Element.elementWithSimpleXPath(responseNode,'propstat.prop.calendar-home-set.href');var displaynameValue=Element.firstNodeValue(displayname);var usertypeValue=Element.firstNodeValue(usertype);var calendarhomeValue=Element.firstNodeValue(calendarhome);if(displayname&&calendarhome&&wantedCalUserTypes.include(usertypeValue)){matchingUsers.push({href:href,uid:href,url:calendarhomeValue,displayname:displaynameValue,cutype:usertypeValue});}}}
if(inCallback)inCallback(transport.request,matchingUsers);}
return new Ajax.CalendarRequest('/principals/'+inSearchTypes[0]+'/',{method:'report',contentType:'text/xml',postBody:reportTxt,requestHeaders:{Depth:'0'},onSuccess:callback.bind(this),onException:reportError,errorNotificationObject:this});},isIndividual:function(){return(this.mUserPrincipalInfo.calendarUserType=='INDIVIDUAL');},startWeekday:function(){var results=document.cookie.match(/startWeekday=(\d)/);return(results?parseInt(results[1]):this.mDefaultStartWeekday);},setStartWeekday:function(inWeekdayInt){var expireDate=new Date();expireDate.setFullYear(expireDate.getFullYear()+5);document.cookie='startWeekday='+inWeekdayInt+'; path=/; expires='+expireDate.toGMTString();publisher().publish('START_WEEKDAY_CHANGED',this,{startWeekday:inWeekdayInt});}}
var RemoteCalendarCollection=Class.create();RemoteCalendarCollection.prototype={mDefaultCalendarColorIdx:0,initialize:function(inCollectionBasePath){this.mDefaultCalendarColors=RemoteCalendarCollection.defaultCalendarColors;this.mCollectionBasePath=inCollectionBasePath;this.getCalendars();},nextAvailableCalendarColor:function(inOptExceptionArray){if(!inOptExceptionArray)inOptExceptionArray=$A([]);var calendarColorsCopy=this.mDefaultCalendarColors.clone();this.mCalendars.each(function(calObj){var colorIdx=calendarColorsCopy.indexOf(calObj.mColor);if(colorIdx>=0&&inOptExceptionArray.indexOf(calObj)<0){calendarColorsCopy.splice(colorIdx,1);}});if(calendarColorsCopy.length>0){return calendarColorsCopy[0];}
return this.mDefaultCalendarColors[(this.mDefaultCalendarColorIdx++)%this.mDefaultCalendarColors.length];},getCalendars:function(){var callback=function(transport){this.mInboxCalendar=null;this.mOutboxCalendar=null;this.mCalendars=$A([]);var calendarsNeedingColors=$A([]);if(!transport.responseXML){reportError('Report response is missing responseXML. responseText = '+transport.responseText||'');return false;}
Element.childrenWithNodeName(Element.firstChildWithNodeName(transport.responseXML,'multistatus'),'response').each(function(responseNode){var href=Element.firstNodeValue(Element.firstChildWithNodeName(responseNode,'href'));var resourceType=Element.elementWithSimpleXPath(responseNode,'propstat.prop.resourcetype');var isCollection=Element.firstChildWithNodeName(resourceType,'collection');var needsColor=false;if(isCollection&&(href!=this.mCollectionBasePath)){var createCalendar=function(inOptCreateColor){var displayName=Element.firstNodeValue(Element.elementWithSimpleXPath(responseNode,'propstat.prop.displayname'));var calendarColor=Element.firstNodeValue(Element.elementWithSimpleXPath(responseNode,'propstat.prop.calendar-color'));var ctag=Element.elementWithSimpleXPath(responseNode,'propstat.prop.getctag');if(inOptCreateColor&&!calendarColor){calendarColor=this.mDefaultCalendarColors[0];needsColor=true;}
var createdCal=new RemoteCalendar(href,displayName,calendarColor);if(ctag)createdCal.mCtag=Element.firstNodeValue(ctag);return createdCal;}.bind(this);if(Element.firstChildWithNodeName(resourceType,'schedule-inbox')){this.mInboxCalendar=createCalendar();}
else if(Element.firstChildWithNodeName(resourceType,'schedule-outbox')){this.mOutboxCalendar=createCalendar();}
else if(Element.firstChildWithNodeName(resourceType,'calendar')){var calObj=createCalendar(true);this.mCalendars.push(calObj);if(needsColor)calendarsNeedingColors.push(calObj);}}}.bind(this));this.mCalendars=Array.sortArrayUsingKey(this.mCalendars,'mDisplayName');calendarsNeedingColors=Array.sortArrayUsingKey(calendarsNeedingColors,'mDisplayName');this.mDefaultCalendarColorIdx=0;while(calendarsNeedingColors.length>0){var calObj=calendarsNeedingColors[0];calObj.mColor=this.nextAvailableCalendarColor(calendarsNeedingColors);calendarsNeedingColors.shift();calObj.renameCalendar(calObj.mDisplayName,calObj.mColor,null,true);}
publisher().publish('GOT_CALENDAR_COLLECTION',this);}
return new Ajax.CalendarRequest(this.mCollectionBasePath,{method:'propfind',contentType:'application/xml',postBody:'<?xml version="1.0" ?><D:propfind xmlns:D="DAV:" xmlns:I="http://apple.com/ns/ical/" xmlns:CS="http://calendarserver.org/ns/"><D:prop><D:displayname/><D:resourcetype/><I:calendar-color/><CS:getctag/></D:prop></D:propfind>',requestHeaders:{Depth:'1'},onSuccess:callback.bind(this),onException:reportError,errorNotificationObject:this});},updateCalendarCTags:function(inCallback){var callback=function(transport){if(!transport.responseXML){reportError('Report response is missing responseXML. responseText = '+transport.responseText||'');return false;}
var updatedCalendars=$A([]);Element.childrenWithNodeName(Element.firstChildWithNodeName(transport.responseXML,'multistatus'),'response').each(function(responseNode){var href=Element.firstNodeValue(Element.firstChildWithNodeName(responseNode,'href'));var resourceType=Element.elementWithSimpleXPath(responseNode,'propstat.prop.resourcetype');var isCollection=Element.firstChildWithNodeName(resourceType,'collection');var ctag=Element.elementWithSimpleXPath(responseNode,'propstat.prop.getctag');if(isCollection&&(href!=this.mCollectionBasePath)){var cal=this.calendarWithPath(href);var isUpdated=(!cal||!cal.mCtag||!ctag||cal.mCtag!=Element.firstNodeValue(ctag));if(cal&&ctag&&Element.firstNodeValue(ctag))cal.mCtag=Element.firstNodeValue(ctag);if(cal&&cal==this.mInboxCalendar){if(isUpdated)updatedCalendars.shouldFetchInbox=true;}
else if(cal){if(isUpdated)updatedCalendars.push(cal);}
else if(Element.firstChildWithNodeName(resourceType,'calendar')&&href!=this.mOutboxCalendar.mCalendarBasePath){updatedCalendars.shouldFetchCollection=true;}}}.bind(this));if(inCallback)inCallback(updatedCalendars);}
return new Ajax.CalendarRequest(this.mCollectionBasePath,{method:'propfind',contentType:'application/xml',postBody:'<?xml version="1.0" ?><D:propfind xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/"><D:prop><D:resourcetype/><CS:getctag/></D:prop></D:propfind>',requestHeaders:{Depth:'1'},onSuccess:callback.bind(this),onException:reportError,errorNotificationObject:this});},calendarWithPath:function(inPath){var path=(inPath.indexOf('/')!=0)?String.addSlash(String.appendPathComponent(this.mCollectionBasePath,inPath)):inPath;if(String.addSlash(this.mInboxCalendar.mCalendarBasePath)==path)return this.mInboxCalendar;return this.mCalendars.detect(function(calObj){return(String.addSlash(calObj.mCalendarBasePath)==path);});},getInboxContents:function(inCallback){var gotInboxCallback=function(transport){var request=null;var hrefs=$A([]);Element.childrenWithNodeName(Element.firstChildWithNodeName(transport.responseXML,'multistatus'),'response').each(function(responseNode){if(Element.firstNodeValue(Element.elementWithSimpleXPath(responseNode,'propstat.prop.getcontenttype')).match(/^(text\/calendar|application\/xml)/)){hrefs.push(Element.firstNodeValue(Element.firstChildWithNodeName(responseNode,'href')));}
else if(Element.firstNodeValue(Element.firstChildWithNodeName(responseNode,'href'))==this.mInboxCalendar.mCalendarBasePath){var availElm=Element.elementWithSimpleXPath(responseNode,'propstat.prop.calendar-availability');if(availElm&&Element.firstNodeValue(availElm)&&Element.firstNodeValue(availElm).match(/\S/)){var availCal=new CalendarFile(Element.firstNodeValue(availElm),this.mInboxCalendar.mCalendarBasePath,this.mInboxCalendar);if(availCal.mCalendarObj.VCALENDAR[0].VAVAILABILITY&&availCal.mCalendarObj.VCALENDAR[0].VAVAILABILITY[0].AVAILABLE&&availCal.mCalendarObj.VCALENDAR[0].VAVAILABILITY[0].AVAILABLE.length==1){var availability=new CalendarEvent(availCal,availCal.mCalendarObj.VCALENDAR[0].VAVAILABILITY[0].AVAILABLE[0]);if(availability.recurrenceInfo()&&availability.recurrenceInfo().isWeekdays())this.mAvailability=availability;}}}},this);if(hrefs.length<=0){if(this.mAvailability){var timezoneCallback=function(){if(inCallback)inCallback(request,$A([]));}
timezoneService().fetchOffsetsForEvents(timezoneCallback,$A([this.mAvailability]));}
else{if(inCallback)inCallback(request,$A([]));return;}}
var inboxMultigetCallback=function(transport){var calendarEvents=$A([]);Element.childrenWithNodeName(Element.firstChildWithNodeName(transport.responseXML,'multistatus'),'response').each(function(responseNode){if(Element.firstNodeValue(Element.elementWithSimpleXPath(responseNode,'propstat.status')).indexOf('200')>0){var href=Element.firstNodeValue(Element.firstChildWithNodeName(responseNode,'href'));var calendarText=Element.firstNodeValue(Element.elementWithSimpleXPath(responseNode,'propstat.prop.calendar-data'));var calendarFile=new CalendarFile(calendarText,href,this.mInboxCalendar);calendarEvents=calendarEvents.concat(calendarFile.mEvents);}},this);var timezoneCallback=function(){if(inCallback)inCallback(request,calendarEvents);}
var timezoneEvents=calendarEvents.clone();if(this.mAvailability)timezoneEvents.push(this.mAvailability);timezoneService().fetchOffsetsForEvents(timezoneCallback,timezoneEvents);}
var multiGetText='<?xml version="1.0" encoding="utf-8" ?>\n'
+'<C:calendar-multiget xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">\n'
+' <D:prop>\n'
+'  <D:getetag/>\n'
+'  <C:calendar-data/>\n'
+' </D:prop>\n'
+'%(hrefs)s\n'
+'</C:calendar-multiget>';var hrefText='<D:href>%(href)s</D:href>';multiGetText=String.format(multiGetText,{hrefs:hrefs.collect(function(href){return String.format(hrefText,{href:href});}).join('\n')});var req=new Ajax.CalendarRequest(this.mInboxCalendar.mCalendarBasePath,{method:'report',contentType:'application/xml',postBody:multiGetText,onSuccess:inboxMultigetCallback.bind(this),onException:reportError,errorNotificationObject:this});}
request=new Ajax.CalendarRequest(this.mInboxCalendar.mCalendarBasePath,{method:'propfind',contentType:'application/xml',postBody:'<?xml version="1.0" ?><D:propfind xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/"><D:prop><CS:calendar-availability/><D:getetag/><D:getcontenttype/></D:prop></D:propfind>',requestHeaders:{Depth:'1'},onSuccess:gotInboxCallback.bind(this),onException:reportError,errorNotificationObject:this});return request;},getEventsForDateRange:function(inStartDate,inEndDate,inCallback){var requestUID=CalendarUuid.generateUUIDString();var gotTimezonesCallback=function(){var requestCount=this.mCalendars.length;var eventsToReturn=$A([]);var request=null;var calendarResultsCallback=function(inRequestObj,inResponseObj){eventsToReturn=eventsToReturn.concat(inResponseObj);if(--requestCount<=0){var gotTimezoneOffsetsCallback=function(){var inboxCalendar=this.mInboxCalendar;eventsToReturn=Array.removeDuplicateRows(eventsToReturn,function(inEarlier,inLater){return(inEarlier.uid==inLater.uid&&inEarlier.mParentCalendarFile==inboxCalendar);});inCallback(requestUID,eventsToReturn);}
timezoneService().fetchOffsetsForEvents(gotTimezoneOffsetsCallback.bind(this),eventsToReturn,inStartDate,inEndDate);}}
this.mCalendars.each(function(cal){request=cal.getEventsForDateRange(inStartDate,inEndDate,calendarResultsCallback);});if(!request){setTimeout(function(){inCallback(requestUID,eventsToReturn)},10);}}
timezoneService().fetchOffsetsForDateRange(gotTimezonesCallback.bind(this),inStartDate,inEndDate);return requestUID;},findEquivalentToInboxCalendarEvent:function(inCalendarEvent,inCallback){var eventWindow=3;var startDate=inCalendarEvent.startDate();startDate.setHours(0);startDate.setMinutes(0);startDate.setSeconds(0);startDate.setDate(startDate.getDate()-eventWindow);var endDate=new Date(startDate.getTime());endDate.setDate(endDate.getDate()+(eventWindow*2));var gotCalendarEventsCallback=function(inRequest,inEvents){var matchingEvents=inEvents.select(function(event){return event.valueForProperty('UID')==inCalendarEvent.valueForProperty('UID')&&event.mParentCalendarFile.mParentCalendar!=this.mInboxCalendar&&event.mParentCalendarFile.mFileLocation.indexOf('/inbox/')==-1;});if(matchingEvents.length>0)
{if(inCallback)inCallback(matchingEvents[0]);return;}
if(inCallback)inCallback(null);}
this.getEventsForDateRange(startDate,endDate,gotCalendarEventsCallback.bind(this));},setWeekdayAvailability:function(inStartTime,inEndTime,inCallback){var gotTimezoneStringCallback=function(){var delta=inStartTime.getDay()-1;inStartTime.setDate(inStartTime.getDate()-delta);inEndTime.setFullYear(inStartTime.getFullYear());inEndTime.setMonth(inStartTime.getMonth());inEndTime.setDate(inStartTime.getDate());var availabilityEvent=this.mInboxCalendar.createCalendarEvent();availabilityEvent.setStartDate(inStartTime);availabilityEvent.setEndDate(inEndTime);availabilityEvent.convertEventDurationToEndDate();availabilityEvent.setPropertyValue('RRULE','FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR');availabilityEvent.mParentCalendarFile.deleteKeyFromMember('DESCRIPTION',availabilityEvent.mEventStruct);var availabilityText=availabilityEvent.mParentCalendarFile.updatedCalendarText();var uuid=CalendarUuid.generateUUIDString();var dtstamp=dateObjToISO8601(new Date(),true,true);availabilityText=availabilityText.replace(/BEGIN:VTIMEZONE/m,'CALSCALE:GREGORIAN\nBEGIN:VTIMEZONE');availabilityText=availabilityText.replace(/BEGIN:VEVENT/m,'BEGIN:VAVAILABILITY\nUID:'+uuid+'\nDTSTAMP:'+dtstamp+'\nCREATED:'+dtstamp+'\nBEGIN:AVAILABLE');availabilityText=availabilityText.replace(/END:VEVENT/m,'END:AVAILABLE\nEND:VAVAILABILITY');var requestBody='<?xml version="1.0" encoding="utf-8" ?>\n'
+'<D:propertyupdate xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/">\n'
+' <D:set>\n'
+'  <D:prop>\n'
+'   <CS:calendar-availability><![CDATA[%(availabilityText)s]]></CS:calendar-availability>\n'
+'  </D:prop>\n'
+' </D:set>\n'
+'</D:propertyupdate>';requestBody=String.format(requestBody,{availabilityText:availabilityText.escapeHTML()});var savedAvailabilityCallback=function(){this.mAvailability=availabilityEvent;if(inCallback)inCallback(availabilityEvent);}
var req=new Ajax.CalendarRequest(this.mInboxCalendar.mCalendarBasePath,{method:'proppatch',contentType:'text/xml',postBody:requestBody,requestHeaders:{Depth:'0'},onSuccess:savedAvailabilityCallback.bind(this),onException:reportError,errorNotificationObject:this});if(inCallback)inCallback();}
timezoneService().fetchCurrentTimezoneString(gotTimezoneStringCallback.bind(this));},makeCalendar:function(inCalendarName,inCallback,inOptCalendarColor){var calendarcolor=inOptCalendarColor||this.nextAvailableCalendarColor();var makeCalendarText='<?xml version="1.0" encoding="utf-8" ?>\n'
+'<C:mkcalendar xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:I="http://apple.com/ns/ical/">\n'
+' <D:set>\n'
+' <D:prop>\n'
+'  <D:displayname>%(displayname)s</D:displayname>\n'
+'  <I:calendar-color>%(calendarcolor)s</I:calendar-color>\n'
+'  <C:schedule-calendar-transp><C:opaque/></C:schedule-calendar-transp>\n'
+' </D:prop>\n'
+' </D:set>\n'
+'</C:mkcalendar>';makeCalendarText=String.format(makeCalendarText,{displayname:inCalendarName.escapeHTML(),calendarcolor:calendarcolor.escapeHTML()});var mkCalCallback=function(transport){this.getCalendars();if(inCallback)inCallback();}
return new Ajax.CalendarRequest(String.addSlash(this.mCollectionBasePath)+CalendarUuid.generateUUIDString()+'/',{method:'mkcalendar',contentType:'application/xml',postBody:makeCalendarText,onSuccess:mkCalCallback.bind(this),onException:reportError,errorNotificationObject:this});},deleteCalendar:function(inCalendar,inCallback){var calendarIdx=this.mCalendars.length;while(--calendarIdx>=0){if(this.mCalendars[calendarIdx]==inCalendar){this.mCalendars.splice(calendarIdx--,1);return new Ajax.CalendarRequest(inCalendar.mCalendarBasePath,{method:'delete',onSuccess:function(){if(inCallback)inCallback()},onException:reportError,errorNotificationObject:this});}}}}
RemoteCalendarCollection.defaultCalendarColors=$A(['#0052D3','#2CA00A','#E41616','#F57700','#AF26AD','#492BA0']);var RemoteCalendar=Class.create();RemoteCalendar.prototype={initialize:function(inCalendarBasePath,inOptDisplayName,inOptColor){this.mCalendarBasePath=inCalendarBasePath;this.mLastPathComponent=String.lastPathComponent(inCalendarBasePath);this.mDisplayName=(inOptDisplayName&&inOptDisplayName.match(/\S/))?inOptDisplayName:this.mLastPathComponent;this.mColor=(inOptColor&&inOptColor.match(/^#[0-9A-Fa-f]{6}/))?inOptColor:'#0067C3';this.mColor=this.mColor.substr(0,7);this.mEnabled=true;},pathForNewEvents:function(){return this.mCalendarBasePath.replace(/\/$/,'')+'/';},iCalSubscriptionURL:function(){return String.appendPathComponent(principalService().iCalSubscriptionURLPrefix(),this.mCalendarBasePath).replace(/\/$/,'');},renameCalendar:function(inDisplayName,inOptColor,inCallback,inOptForceColorSave){var requestBody='<?xml version="1.0" encoding="utf-8" ?>\n'
+'<D:propertyupdate xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/" xmlns:I="http://apple.com/ns/ical/">\n'
+' <D:set>\n'
+'  <D:prop>\n'
+'  %(displaynameprop)s\n'
+'  %(calendarcolorprop)s\n'
+'  </D:prop>\n'
+' </D:set>\n'
+'</D:propertyupdate>';var displaynameprop='';if(inDisplayName&&inDisplayName.match(/\S/)&&inDisplayName!=this.mDisplayName){this.mDisplayName=inDisplayName;displaynameprop='<D:displayname>'+inDisplayName.escapeHTML()+'</D:displayname>';}
var calendarcolorprop='';if(inOptColor&&inOptColor.match(/\S/)&&(inOptForceColorSave||inOptColor!=this.mColor)){this.mColor=inOptColor;calendarcolorprop='<I:calendar-color>'+inOptColor.toUpperCase().escapeHTML()+'</I:calendar-color>';}
if(displaynameprop==''&&calendarcolorprop==''){if(inCallback)inCallback();return;}
requestBody=String.format(requestBody,{displaynameprop:displaynameprop,calendarcolorprop:calendarcolorprop});var savedDisplayNameCallback=function(){this.mDisplayName=inDisplayName;if(inCallback)inCallback();}
return new Ajax.CalendarRequest(this.mCalendarBasePath,{method:'proppatch',contentType:'text/xml',postBody:requestBody,requestHeaders:{Depth:'0'},onSuccess:savedDisplayNameCallback.bind(this),onException:reportError,errorNotificationObject:this});},createCalendarEvent:function(){var cfile=new CalendarFile(null,null,this);cfile.mEvents[0].mIsNew=true;return cfile.mEvents[0];},parseResponse:function(transport){var calendarFiles=new Hash();var calendarEvents=$A([]);if(!transport.responseXML){debug_message('Report response is missing responseXML. responseText = '+transport.responseText||'');return false;}
var responseNodes=Element.childrenWithNodeName(Element.firstChildWithNodeName(transport.responseXML,'multistatus'),'response');for(var responseNodeIdx=0;responseNodeIdx<responseNodes.length;responseNodeIdx++){var responseNode=responseNodes[responseNodeIdx];var status=Element.elementWithSimpleXPath(responseNode,'propstat.status').firstChild.nodeValue;if(!status.match(/200/))continue;var scheduleTagElm=Element.elementWithSimpleXPath(responseNode,'propstat.prop.schedule-tag');var fileLocation=Element.firstChildWithNodeName(responseNode,'href').firstChild.nodeValue;var calendarText=Element.elementWithSimpleXPath(responseNode,'propstat.prop.calendar-data').firstChild.nodeValue;var calendarFile=new CalendarFile(calendarText,fileLocation,this);if(scheduleTagElm){calendarFile.mScheduleTag=scheduleTagElm.firstChild.nodeValue;}
calendarEvents=calendarEvents.concat(calendarFile.mEvents);calendarFiles.set(fileLocation,calendarFile);}
return{calendarFiles:calendarFiles,calendarEvents:calendarEvents};},runReport:function(inReportText,inCallback,inGetFullEvents){var multiGetText='<?xml version="1.0" encoding="utf-8" ?>\n'
+'<C:calendar-multiget xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">\n'
+' <D:prop>\n'
+'  <D:getetag/>\n'
+'  <C:calendar-data/>\n'
+'  <C:schedule-tag/>\n'
+' </D:prop>\n'
+'%(hrefs)s\n'
+'</C:calendar-multiget>';var hrefText='<D:href>%(href)s</D:href>';var reportCallback=function(transport){var reportContent=this.parseResponse(transport);multiGetText=String.format(multiGetText,{hrefs:reportContent.calendarFiles.keys().collect(function(href){return String.format(hrefText,{href:href});}).join('\n')});var timezoneFetchCallback=function(){if(inCallback)inCallback(transport.request,reportContent.calendarEvents);}
if(inGetFullEvents){var multiGetCallback=function(multiTransport){var multiGetContent=this.parseResponse(multiTransport);var tzoffsetCallback=function(){multiGetContent.calendarFiles.values().each(function(fullFile){var partialFile=reportContent.calendarFiles.get(fullFile.mFileLocation);if(!partialFile)return;partialFile.mOriginalCalendarFile=fullFile;partialFile.revertToSaved();for(var partialEvtIdx=0;partialEvtIdx<partialFile.mEvents.length;partialEvtIdx++){var partialEvt=partialFile.mEvents[partialEvtIdx];if(partialEvt.mEventStruct['RECURRENCE-ID'])continue;if(!fullFile.mEvents.pluck('uid').include(partialEvt.uid+'/'+dateObjToISO8601(partialEvt.startDate(),true,true)))continue;partialEvt.setVisible(false);}});timezoneService().fetchCurrentTimezoneString(timezoneFetchCallback);}
var allEvents=multiGetContent.calendarFiles.values().pluck('mEvents').flatten();timezoneService().fetchOffsetsForEvents(tzoffsetCallback.bind(this),allEvents);}
var req=new Ajax.CalendarRequest(this.mCalendarBasePath,{method:'report',contentType:'application/xml',postBody:multiGetText,onSuccess:multiGetCallback.bind(this),onException:reportError,errorNotificationObject:this});}
else{timezoneService().fetchCurrentTimezoneString(timezoneFetchCallback);}}
return new Ajax.CalendarRequest(this.mCalendarBasePath,{method:'report',contentType:'application/xml',postBody:inReportText,requestHeaders:{Depth:'1'},onSuccess:reportCallback.bind(this),onException:reportError,errorNotificationObject:this});},reportTemplate:function(){return'<?xml version="1.0" encoding="utf-8" ?>\n'
+'<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">\n'
+' <D:prop>\n'
+'  <D:getetag/>\n'
+'  <C:calendar-data>\n'
+'   <C:expand start="%(startDate)s" end="%(endDate)s"/>\n'
+'   <C:comp name="VCALENDAR">\n'
+'    <C:prop name="VERSION"/>\n'
+'    <C:comp name="VEVENT">\n'
+'     <C:prop name="UID"/>\n'
+'     <C:prop name="DTSTART"/>\n'
+'     <C:prop name="DTEND"/>\n'
+'     <C:prop name="DURATION"/>\n'
+'     <C:prop name="RRULE"/>\n'
+'     <C:prop name="RDATE"/>\n'
+'     <C:prop name="EXRULE"/>\n'
+'     <C:prop name="EXDATE"/>\n'
+'     <C:prop name="RECURRENCE-ID"/>\n'
+'    </C:comp>\n'
+'   </C:comp>\n'
+'  </C:calendar-data>\n'
+' </D:prop>\n'
+' <C:filter>\n'
+'  <C:comp-filter name="VCALENDAR">\n'
+'   <C:comp-filter name="VEVENT">\n'
+'    %(filter)s\n'
+'   </C:comp-filter>\n'
+'  </C:comp-filter>\n'
+' </C:filter>\n'
+'</C:calendar-query>';},getEventsForDateRange:function(inStartDate,inEndDate,inCallback){var formatParams={startDate:dateObjToISO8601(inStartDate,true),endDate:dateObjToISO8601(inEndDate,true)};formatParams.filter=String.format('<C:time-range start="%(startDate)s" end="%(endDate)s"/>',formatParams);var reportText=String.format(this.reportTemplate(),formatParams);return this.runReport(reportText,inCallback,true);},expandRecurrencesForEventWithUID:function(inEventUID,inStartDate,inEndDate,inCallback){var formatParams={startDate:dateObjToISO8601(inStartDate),endDate:dateObjToISO8601(inEndDate),uid:inEventUID};formatParams.filter=String.format('<C:prop-filter name="UID"><C:text-match collation="i;octet">%(uid)s</C:text-match></C:prop-filter>',formatParams);var reportText=String.format(this.reportTemplate(),formatParams);return this.runReport(reportText,inCallback,true);}}
var CalendarFile=Class.create();CalendarFile.prototype={initialize:function(inCalendarText,inFileLocation,inParentCalendar){if(!inCalendarText&&!inFileLocation){inCalendarText=String.format(CalendarFile.defaultFormat,{DTSTAMP:dateObjToISO8601(new Date()),DTSTART:dateObjToISO8601(new Date()),UID:CalendarUuid.generateUUIDString(),SUMMARY:'New Event',TZID:timezoneService().selectedTimezone(),TIMEZONE:timezoneService().mCurrentTimezoneString||''});}
this.mFileLocation=inFileLocation;this.mParentCalendar=inParentCalendar;inCalendarText=inCalendarText.replace(/\r\n/gm,'\n').replace(/\n\s/gm,'');var lines=inCalendarText.split('\n');this.mCalendarObj=$A([]);var stack=$A([this.mCalendarObj]);lineIdxLabel:for(var lineIdx=0;lineIdx<lines.length;lineIdx++){var line=lines[lineIdx];while(line.match(/\\$/)){line=line.replace(/\\$/,'\n');line+=lines[lineIdx+1];lines.splice(lineIdx--,1);}
if(line.indexOf(':')<0)continue;line=line.strip();var key='';var valueObj={value:''};var charIdx=(-1),charLength=line.length;while(charIdx++<charLength){if(line.charAt(charIdx)==';'){break;}
if(line.charAt(charIdx)==':'){charIdx--;break;}
key+=line.charAt(charIdx);}
if(key=='')continue;valueObj.key=key;while(charIdx++<charLength){if(line.charAt(charIdx)==':'){break;}
var attrName='';charIdx--;while(charIdx++<charLength){if(line.charAt(charIdx)=='='){break;}
attrName+=line.charAt(charIdx);}
if(attrName=='')continue;var attrValue='';var isQuoted=false;if(charIdx<charLength&&line.charAt(charIdx+1)=='"'){isQuoted=true;charIdx++;}
while(charIdx++<charLength){if(isQuoted&&line.charAt(charIdx)=='"'){if(line.charAt(charIdx+1)==';'){charIdx++;}
break;}
if(!isQuoted&&line.charAt(charIdx)==';'){break;}
if(!isQuoted&&line.charAt(charIdx)==':'){charIdx--;break;}
attrValue+=line.charAt(charIdx);}
if(!valueObj.calAttrs)valueObj.calAttrs={};valueObj.calAttrs[attrName]=attrValue;}
valueObj.value=(++charIdx<charLength?line.slice(charIdx):'');if(key=='BEGIN'){var newStackItem=$A([]);newStackItem.key=valueObj.value;if(!stack[stack.length-1][valueObj.value]){var arrayValue=$A([]);stack[stack.length-1].push(arrayValue);stack[stack.length-1][valueObj.value]=arrayValue;}
stack[stack.length-1][valueObj.value].push(newStackItem);stack.push(newStackItem);}
else if(key=='END'){stack.pop();}
else{if(CalendarFile.textProperties.indexOf(valueObj.key)>=0){valueObj.value=valueObj.value.replace(/\\n/gm,'\n').replace(/\\([;\,])/gm,'$1').replace(/\\\\/,'\\');}
stack[stack.length-1].push(valueObj);stack[stack.length-1][key]=valueObj;}}
if(!(this.mCalendarObj.VCALENDAR&&this.mCalendarObj.VCALENDAR.length>0))throw'Invalid calendar.';this.mEvents=$A([]);if(this.mCalendarObj.VCALENDAR[0].VEVENT){for(var eventStructIdx=0;eventStructIdx<this.mCalendarObj.VCALENDAR[0].VEVENT.length;eventStructIdx++){this.mEvents.push(new CalendarEvent(this,this.mCalendarObj.VCALENDAR[0].VEVENT[eventStructIdx]));}}},allReferencedTZIDs:function(){return this.mEvents.collect(function(evt){return evt.allReferencedTZIDs();}).flatten().uniq();},iTIPMethod:function(){if(this.mCalendarObj.VCALENDAR[0].METHOD)return this.mCalendarObj.VCALENDAR[0].METHOD.value;if(this.mOriginalCalendarFile&&this.mOriginalCalendarFile.mCalendarObj.VCALENDAR[0].METHOD)return this.mOriginalCalendarFile.mCalendarObj.VCALENDAR[0].METHOD.value;return null;},updatedCalendarText:function(inOptStackItem){var stackItem=inOptStackItem||this.mCalendarObj;var calendarText=stackItem.collect(function(valueObj){if(!valueObj)return;if(valueObj.constructor==Array){if(!valueObj.key)return this.updatedCalendarText(valueObj);return'BEGIN:'+valueObj.key+'\n'+this.updatedCalendarText(valueObj)+'\nEND:'+valueObj.key;}
var valueStr=valueObj.value;if(valueStr.length>0){var lineText=valueObj.key;if(valueObj.calAttrs){$H(valueObj.calAttrs).each(function(attr){if(attr.value!=null){var attrValue=attr.value;if(attrValue.indexOf(';')>=0)attrValue='"'+attrValue+'"';lineText+=';'+[attr.key,attrValue].join('=');}});}
if(CalendarFile.textProperties.indexOf(valueObj.key)>=0){valueStr=valueStr.replace(/\\/gm,'\\\\').replace(/([;\,])/gm,'\\$1').replace(/\n/gm,'\\n');}
lineText=lineText+':'+valueStr;return lineText;}
else{return"\n";}}.bind(this)).join('\n');if(!inOptStackItem)calendarText=calendarText+'\n';return calendarText;},fetchFullFileText:function(inCallback){if(!this.mOriginalCalendarFile&&!this.mFileLocation){this.mOriginalCalendarFile=new CalendarFile(this.updatedCalendarText(),null,this.mParentCalendar);}
if(this.mOriginalCalendarFile){if(inCallback)inCallback();return;}
var gotRRuleCallback=function(transport){this.mOriginalCalendarFile=new CalendarFile(transport.responseText,this.mFileLocation,this.mParentCalendar);this.mOriginalCalendarFile.mEvents.each(function(otherEvt){if(otherEvt.mEventStruct['RECURRENCE-ID'])return;this.mEvents.each(function(myEvt){if(otherEvt.mEventStruct.UID&&myEvt.mEventStruct.UID&&(otherEvt.mEventStruct.UID.value==myEvt.mEventStruct.UID.value)){if(otherEvt.mEventStruct.RRULE){myEvt.mEventStruct.RRULE=otherEvt.mEventStruct.RRULE;myEvt.mRecurrenceInfo=new CalendarRecurrence(myEvt,myEvt.mEventStruct.RRULE.value);}
else{myEvt.mEventStruct.RRULE=null;}}});}.bind(this));if(inCallback)inCallback();}
return new Ajax.CalendarRequest(this.mFileLocation,{method:'get',onSuccess:gotRRuleCallback.bind(this),onException:reportError,errorNotificationObject:this});},revertToSaved:function(inOptRevertDates){var gotFullFileCallback=function(){this.mOriginalCalendarFile.mEvents.invoke('normalizeRecurrenceUID');var otherEventUIDs=this.mOriginalCalendarFile.mEvents.pluck('uid');for(var otherEvtIdx=0;otherEvtIdx<this.mOriginalCalendarFile.mEvents.length;otherEvtIdx++){var otherEvt=this.mOriginalCalendarFile.mEvents[otherEvtIdx];for(var myEvtIdx=0;myEvtIdx<this.mEvents.length;myEvtIdx++){var myEvt=this.mEvents[myEvtIdx];if(!otherEvt.mEventStruct.UID||!myEvt.mEventStruct.UID)continue;if(otherEvt.mEventStruct.UID.value!=myEvt.mEventStruct.UID.value)continue;if(otherEvt.mEventStruct['RECURRENCE-ID']&&otherEvt.uid!=myEvt.uid)continue;var replacementStruct=$A([]);if(myEvt.mEventStruct['RECURRENCE-ID']){replacementStruct.push(myEvt.mEventStruct['RECURRENCE-ID']);replacementStruct['RECURRENCE-ID']=replacementStruct.last();}
var structForDates=(inOptRevertDates?myEvt.mOriginalDateStruct:myEvt.mEventStruct);for(var propIdx=0;propIdx<structForDates.length;propIdx++){var prop=structForDates[propIdx];prop={key:prop.key,calAttrs:Object.clone(prop.calAttrs),value:prop.value};if(['DTSTART','DTEND','DURATION'].indexOf(prop.key)>=0){replacementStruct.push(prop);replacementStruct[prop.key]=prop;}}
for(var propIdx=0;propIdx<otherEvt.mEventStruct.length;propIdx++){var prop=otherEvt.mEventStruct[propIdx];prop={key:prop.key,calAttrs:Object.clone(prop.calAttrs),value:prop.value};if(['DTSTART','DTEND','DURATION'].indexOf(prop.key)<0){replacementStruct.push(prop);replacementStruct[prop.key]=prop;}}
myEvt.mEventStruct=replacementStruct;if(myEvt.mEventStruct.RRULE){myEvt.mRecurrenceInfo=new CalendarRecurrence(myEvt,myEvt.mEventStruct.RRULE.value);}}}}
this.fetchFullFileText(gotFullFileCallback.bind(this));},deleteKeyFromMember:function(inKey,inMember){delete inMember[inKey];for(var pairIdx=0;pairIdx<inMember.length;pairIdx++){if(inMember[pairIdx].key==inKey){inMember.splice(pairIdx,1);return true;}}
return false;},deleteEvent:function(inDeleteCallback){if(!this.mFileLocation)return null;var callback=function(transport){if(inDeleteCallback)inDeleteCallback(transport);}
return new Ajax.CalendarRequest(this.mFileLocation,{method:'delete',onSuccess:callback,onException:reportErrorInDebugMode,errorNotificationObject:this});},expandRecurrencesForEvent:function(inEvent,inStartDate,inEndDate,inCallback){var queryUID=inEvent.valueForProperty('UID');var callback=function(q,r){for(var myEvtIdx=0;myEvtIdx<this.mEvents.length;myEvtIdx++){if(this.mEvents[myEvtIdx].valueForProperty('UID')==queryUID){this.mEvents.splice(myEvtIdx--,1);}}
for(var otherEvtIdx=0;otherEvtIdx<r.length;otherEvtIdx++){var otherEvt=r[otherEvtIdx];otherEvt.mParentCalendarFile=this;this.mEvents.push(otherEvt);}
if(inCallback)inCallback(q,r);}
return this.mParentCalendar.expandRecurrencesForEventWithUID(queryUID,inStartDate,inEndDate,callback.bind(this));},saveToServer:function(inSaveCallback){if(!this.mOriginalCalendarFile){return this.fetchFullFileText(function(){this.saveToServer(inSaveCallback)}.bind(this));}
this.mEvents.each(function(evt){if(evt.originalEventFromRecurrence(true))return;var otherEvt=this.mOriginalCalendarFile.mEvents.detect(function(oEvt){return(oEvt.uid==evt.uid);});if(!otherEvt)return;otherEvt.setPropertyValue('DTSTAMP',dateObjToISO8601(new Date(),true,true));otherEvt.incrementSequenceNumber();var changedProperty=evt.updateStack().pop();while(changedProperty){if(changedProperty=='DTSTART'&&evt.recurrenceInfo()){var matchingStartException=false;var excepts=evt.exceptionDates();for(var i=0;i<excepts.length;i++){if(dateObjToISO8601(excepts[i],true,true)==evt.mOriginalDateStruct[0].value){matchingStartException=true;break;}}
if(matchingStartException){changedProperty=evt.updateStack().pop();continue;}
if(otherEvt.startDate().getTime()-evt.startDate().getTime()!=0){var movedAmt=getDurationUsingEndDate(otherEvt.startDate(),evt.startDate());this.mOriginalCalendarFile.mEvents.each(function(oEvt){if(oEvt.valueForProperty('UID')==evt.uid){var recurrenceID=oEvt.recurrenceID();var recurrenceDate=recurrenceID?createDateObjFromISO8601(recurrenceID):null;if(recurrenceDate){recurrenceDate=getEndDateUsingDuration(recurrenceDate,movedAmt);oEvt.setRecurrenceID(dateObjToISO8601(recurrenceDate,false,false));}
for(var i=0;i<oEvt.mEventStruct.length;i++){param=oEvt.mEventStruct[i];if(param.key=='EXDATE'){var dt=createDateObjFromISO8601(param.value);dt=getEndDateUsingDuration(dt,movedAmt);param.value=dateObjToISO8601(dt);}}}});}}
if(CalendarFile.multiProperties.include(changedProperty)){for(var i=otherEvt.mEventStruct.length-1;i>=0;i--){if(otherEvt.mEventStruct[i]&&otherEvt.mEventStruct[i].key==changedProperty){otherEvt.mEventStruct.splice(i,1);}}
if(otherEvt.mEventStruct[changedProperty])delete otherEvt.mEventStruct[changedProperty];evt.mEventStruct.each(function(prop){if(prop.key==changedProperty){otherEvt.mEventStruct.push(prop);otherEvt.mEventStruct[changedProperty]=prop;}});}
else{var foundProp=otherEvt.mEventStruct[changedProperty];if(foundProp){otherEvt.mEventStruct.splice(otherEvt.mEventStruct.indexOf(foundProp),1,evt.mEventStruct[changedProperty]);}
else{otherEvt.mEventStruct.push(evt.mEventStruct[changedProperty]);}
otherEvt.mEventStruct[changedProperty]=evt.mEventStruct[changedProperty];}
changedProperty=evt.updateStack().pop();}
evt.rememberDates();otherEvt.mUpdateStack=$A([]);}.bind(this));timezoneService().fetchCurrentTimezoneString(function(str,parsed){if(this.mTimezoneHijacked)
{this.mTimezoneHijacked=false;var makeDetectorByKey=function(key){return function(el){return el.constructor==Array&&el[0].key==key;};}
var calendars=this.mOriginalCalendarFile.mCalendarObj.VCALENDAR;var tzids=this.allReferencedTZIDs();var selectedTZID=timezoneService().selectedTimezone();var selectedTZIDSeen=false;calendars[0]=calendars[0].reject(function(el){if(el.constructor==Array&&el[0].key=='VTIMEZONE')
{if(selectedTZID==el[0].TZID.value)
selectedTZIDSeen=true;return!tzids.include(el[0].TZID.value);}
return false;});calendars[0].key='VCALENDAR';if(!selectedTZIDSeen)
{calendars[0].splice(calendars[0].indexOf(calendars[0].detect(makeDetectorByKey('VEVENT'))),0,parsed);calendars[0].VTIMEZONE=parsed;}}
var requestHeaders={};var calendarText=this.mOriginalCalendarFile.updatedCalendarText();if(!this.mFileLocation){requestHeaders['If-None-Match']='*';var eventUID=(this.mEvents.length==0)?this.grabOriginalUID():this.mEvents[0].mEventStruct.UID.value;this.mFileLocation=String.appendPathComponent(this.mParentCalendar.pathForNewEvents(),eventUID+'.ics');}
else if(this.mScheduleTag){requestHeaders['If-Schedule-Tag-Match']=this.mScheduleTag;}
var savedFileCallback=function(transport){if(inSaveCallback)inSaveCallback(transport);}
requestHeaders['Content-type']='text/calendar';return new Ajax.CalendarRequest(this.mFileLocation,{method:'put',contentType:'text/calendar',postBody:calendarText,onSuccess:savedFileCallback,onException:reportError,errorNotificationObject:this,requestHeaders:requestHeaders});}.bind(this));},moveToCalendar:function(inDestinationCalendar,inCallback){var destination=String.appendPathComponent(inDestinationCalendar.pathForNewEvents(),String.lastPathComponent(this.mFileLocation));var callback=function(){this.mParentCalendar=inDestinationCalendar;this.mFileLocation=destination;if(inCallback)inCallback(this);}
if(false&&(this.mOriginalCalendarFile&&this.mOriginalCalendarFile.mCalendarObj.VCALENDAR[0].METHOD)||this.mCalendarObj.VCALENDAR[0].METHOD){var newfile=new CalendarFile(this.mOriginalCalendarFile?this.mOriginalCalendarFile.updatedCalendarText():this.updatedCalendarText(),null,inDestinationCalendar);var vcal=newfile.mCalendarObj.VCALENDAR[0];newfile.deleteKeyFromMember('METHOD',newfile.mCalendarObj.VCALENDAR[0]);var saveCallback=function(){this.deleteEvent(callback.bind(this));}
var requestHeaders={};requestHeaders['Content-type']='text/calendar';return new Ajax.CalendarRequest(destination,{method:'put',contentType:'text/calendar',postBody:newfile.updatedCalendarText(),requestHeaders:requestHeaders,onSuccess:saveCallback.bind(this),onException:reportError,errorNotificationObject:this});}
return new Ajax.CalendarRequest(this.mFileLocation,{method:'move',requestHeaders:{Destination:destination},onSuccess:callback.bind(this),onException:reportError,errorNotificationObject:this});},grabOriginalUID:function(){return this.mOriginalCalendarFile.mEvents[0].uid;}}
CalendarFile.defaultFormat='BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//Apple Inc.//Web Calendar Client//\n%(TIMEZONE)sBEGIN:VEVENT\nDESCRIPTION:\n'
+'DTSTAMP:%(DTSTAMP)s\nDTSTART;TZID=%(TZID)s:%(DTSTART)s\nDURATION:PT1H\nSEQUENCE:1\nSUMMARY:%(SUMMARY)s\nUID:%(UID)s\nTRANSP:OPAQUE\nEND:VEVENT\nEND:VCALENDAR';CalendarFile.multiProperties=['EXDATE','ATTENDEE'];CalendarFile.textProperties=['CALSCALE','METHOD','PRODID','VERSION','CATEGORIES','CLASS','COMMENT','DESCRIPTION','LOCATION','RESOURCES','STATUS','SUMMARY','TRANSP','TZID','TZNAME','CONTACT','RELATED-TO','UID','ACTION','REQUEST-STATUS'];var CalendarEvent=Class.create();CalendarEvent.prototype={initialize:function(inParentCalendarFile,inEventStruct){this.mVisible=true;this.mUpdateStack=$A([]);this.mParentCalendarFile=inParentCalendarFile;this.mEventStruct=inEventStruct;this.uid=this.mEventStruct.UID.value;if(this.mEventStruct['RECURRENCE-ID']){this.uid+='/'+this.mEventStruct['RECURRENCE-ID'].value;}
this.rememberDates();},toString:function(){var s="Event{\n";this.mEventStruct.each(function(el){if(el.key){s+="\t";s+=el.key+'='+el.value;if(el.calAttrs){for(var av in el.calAttrs){s+=';'+av+'='+el.calAttrs[av];}}
s+="\n";}});return s+'}';},allReferencedTZIDs:function(){var tzids=$A([]);this.mEventStruct.each(function(el){if(el.key){var val=this.attributeForProperty(el.key,'TZID');if(val)
tzids.push(val);}}.bind(this));return tzids.uniq();},rememberDates:function(){this.mOriginalDateStruct=$A([{key:'DTSTART',calAttrs:this.mEventStruct.DTSTART.calAttrs,value:this.mEventStruct.DTSTART.value}]);if(this.mEventStruct['DTEND']){this.mOriginalDateStruct.push({key:'DTEND',calAttrs:this.mEventStruct.DTEND.calAttrs,value:this.mEventStruct.DTEND.value});}
if(this.mEventStruct['DURATION']){this.mOriginalDateStruct.push({key:'DURATION',calAttrs:this.mEventStruct.DURATION.calAttrs,value:this.mEventStruct.DURATION.value});}},normalizeRecurrenceUID:function(){var tzid=this.attributeForProperty('RECURRENCE-ID','TZID');if(!tzid)return;var dtstr=timezoneService().correctDateForTimezone(this.valueForProperty('RECURRENCE-ID'),tzid,true);this.uid=this.valueForProperty('UID')+'/'+dtstr;},useAlphaColors:function(){return SafariFixes.isWebKit||MozillaFixes.isGecko1_9;},alphaFillColor:function(){return'rgba('+$R(0,2).collect(function(i){return parseInt(this.mParentCalendarFile.mParentCalendar.mColor.substring((i*2)+1,(i*2)+3),16);},this).join(',')+','+'0.3)';},color:function(){return this.mParentCalendarFile.mParentCalendar.mColor;},fillColor:function(){if(this.useAlphaColors()){return this.alphaFillColor();}
return this.mParentCalendarFile.mParentCalendar.mColor;},textColor:function(){if(this.useAlphaColors()){return this.mParentCalendarFile.mParentCalendar.mColor;}
return'#FFF';},isNew:function(){return!this.mParentCalendarFile.mFileLocation;},updateStack:function(){if(!this.mUpdateStack)this.mUpdateStack=$A([]);return this.mUpdateStack;},valueForProperty:function(inPropertyName){if(inPropertyName.indexOf(';')>=0){var splitProperty=inPropertyName.split(';');return this.attributeForProperty(splitProperty[0],splitProperty[1]);}
return this.mEventStruct[inPropertyName]?this.mEventStruct[inPropertyName].value:null;},attributeForProperty:function(inPropertyName,inAttributeName){if(!this.mEventStruct[inPropertyName]||!this.mEventStruct[inPropertyName].calAttrs)return null;return this.mEventStruct[inPropertyName].calAttrs[inAttributeName];},setPropertyValue:function(inPropertyName,inValue){if(inPropertyName.indexOf(';')>=0){var splitProperty=inPropertyName.split(';');this.setPropertyAttribute(splitProperty[0],splitProperty[1],inValue);return;}
if(this.valueForProperty(inPropertyName)==inValue)return;this.updateStack().push(inPropertyName);this.mDirty=true;if(inValue==null){var spliceIndex=this.mEventStruct.indexOf(this.mEventStruct[inPropertyName]);if(spliceIndex>=0)this.mEventStruct.splice(spliceIndex,1);if(this.mEventStruct[inPropertyName])delete this.mEventStruct[inPropertyName];return;}
if(!this.mEventStruct[inPropertyName]){var newStackItem={key:inPropertyName,value:inValue};this.mEventStruct.push(newStackItem);this.mEventStruct[inPropertyName]=newStackItem;return;}
this.mEventStruct[inPropertyName]['value']=inValue;},setPropertyAttribute:function(inPropertyName,inAttributeName,inValue){if(this.attributeForProperty(inPropertyName,inAttributeName)==inValue)return;this.updateStack().push(inPropertyName);if(this.mEventStruct[inPropertyName]){if(!this.mEventStruct[inPropertyName]['calAttrs']){this.mEventStruct[inPropertyName]['calAttrs']={};}
if(inValue==null&&this.mEventStruct[inPropertyName]['calAttrs'][inAttributeName]){delete this.mEventStruct[inPropertyName]['calAttrs'][inAttributeName];}
else{this.mEventStruct[inPropertyName]['calAttrs'][inAttributeName]=inValue;}}},hijackEventTimezone:function(){if(this.attributeForProperty('DTSTART','VALUE')=='DATE')return true;this.setPropertyAttribute('DTSTART','TZID',timezoneService().selectedTimezone());if(this.valueForProperty('DTEND'))
this.setPropertyAttribute('DTEND','TZID',timezoneService().selectedTimezone());this.mParentCalendarFile.mTimezoneHijacked=true;},startDate:function(inOptReturnRawFormat,inOptReturnUncorrected){if(this.mCachedStartDate&&!inOptReturnUncorrected){return(inOptReturnRawFormat?this.mCachedStartDate:createDateObjFromISO8601(this.mCachedStartDate));}
var rawStartDate=this.valueForProperty('DTSTART');if(this.banner()){rawStartDate=rawStartDate.replace(/T.+$/,'');this.mCachedStartDate=rawStartDate;return(inOptReturnRawFormat?rawStartDate:createDateObjFromISO8601(rawStartDate));}
if(!inOptReturnUncorrected){rawStartDate=timezoneService().correctDateForTimezone(rawStartDate,this.tzid());this.mCachedStartDate=rawStartDate;}
return(inOptReturnRawFormat?rawStartDate:createDateObjFromISO8601(rawStartDate));},setStartDate:function(inStartDate){if(inStartDate&&(inStartDate.constructor==String||inStartDate.constructor==Number))inStartDate=createDateObjFromISO8601(''+inStartDate);if(inStartDate.getTime()==this.startDate().getTime())return;if(inStartDate&&this.startDate()&&this.mEventStruct.DTEND){this.setEndDate(getEndDateUsingDuration(inStartDate,this.duration()));}
var startDateStr=dateObjToISO8601(inStartDate,false,false);if(startDateStr&&this.banner()){startDateStr=startDateStr.replace(/T.+$/,'');this.setPropertyAttribute('DTSTART','TZID',null);}
this.setPropertyValue('DTSTART',startDateStr);this.hijackEventTimezone();this.mCachedStartDate=timezoneService().correctDateForTimezone(startDateStr,this.tzid());},tzid:function(){return this.attributeForProperty('DTSTART','TZID')||timezoneService().selectedTimezone();},banner:function(){return(this.attributeForProperty('DTSTART','VALUE')=='DATE');},setBanner:function(inBanner){this.setPropertyAttribute('DTSTART','VALUE',(inBanner?'DATE':null));if(inBanner){this.setPropertyAttribute('DTSTART','TZID',null);if(this.valueForProperty('DTEND'))this.setPropertyAttribute('DTEND','TZID',null);}
if(inBanner&&this.valueForProperty('DTSTART').match(/T/)){var dur=this.duration();if(!dur.days||dur.days<1){this.setDuration({days:1});}
this.setPropertyValue('DTSTART',this.valueForProperty('DTSTART').replace(/T.+$/,''));this.mCachedStartDate=this.valueForProperty('DTSTART');}
else if(!inBanner&&!this.valueForProperty('DTSTART').match(/T/)){this.setPropertyValue('DTSTART',this.valueForProperty('DTSTART')+'T000000');}},calculateMissingEndDate:function(){var dt=createDateObjFromISO8601(this.valueForProperty('DTSTART'));if(this.attributeForProperty('DTSTART','VALUE')=='DATE'){dt.setDate(dt.getDate()+1);}
else{dt.setHours(11);dt.setMinutes(59);dt.setSeconds(59);}
return dt;},endDate:function(inOptReturnRawFormat,inOptReturnUncorrected){if(!this.mEventStruct.DTEND){if(this.startDate(false,inOptReturnUncorrected)&&this.mEventStruct.DURATION){var dt=getEndDateUsingDuration(this.startDate(false,inOptReturnUncorrected),this.duration());return(inOptReturnRawFormat?dateObjToISO8601(dt):dt);}
else if(this.mEventStruct.DTSTART){var dt=this.calculateMissingEndDate();return(inOptReturnRawFormat?dateObjToISO8601(dt):dt);}
return null;}
var dtstr=this.mEventStruct.DTEND.value;if(!inOptReturnUncorrected)dtstr=timezoneService().correctDateForTimezone(dtstr,this.tzid());return(inOptReturnRawFormat?dtstr:createDateObjFromISO8601(dtstr));},setEndDate:function(inEndDate){if(inEndDate.constructor==String||inEndDate.constructor==Number)inEndDate=createDateObjFromISO8601(''+inEndDate);if(this.mEventStruct.DURATION){this.setPropertyValue('DURATION',durationToISO8601(getDurationUsingEndDate(this.startDate(),inEndDate)));return;}
var endDateStr=dateObjToISO8601(inEndDate,false,false);if(this.banner()){endDateStr=endDateStr.replace(/T.+$/,'');this.setPropertyAttribute('DTEND','TZID',null);}
this.setPropertyValue('DTEND',endDateStr);this.hijackEventTimezone();},duration:function(){if(this.mEventStruct.DURATION){return durationFromISO8601(this.mEventStruct.DURATION.value);}
else if(this.mEventStruct.DTSTART&&this.mEventStruct.DTEND){return getDurationUsingEndDate(createDateObjFromISO8601(this.valueForProperty('DTSTART')),createDateObjFromISO8601(this.valueForProperty('DTEND')));}
else if(this.mEventStruct.DTSTART){var dt=this.calculateMissingEndDate();return getDurationUsingEndDate(createDateObjFromISO8601(this.valueForProperty('DTSTART')),dt);}
return{days:0,hours:0,minutes:0,seconds:0};},setDuration:function(inDuration){if(inDuration.constructor==String)inDuration=durationFromISO8601(inDuration);if(this.mEventStruct.DTSTART&&this.mEventStruct.DTEND){this.setPropertyValue('DTEND',dateObjToISO8601(getEndDateUsingDuration(this.startDate(),inDuration),false,false));}
else{this.setPropertyValue('DURATION',durationToISO8601(inDuration));}
this.hijackEventTimezone();},convertEventDurationToEndDate:function(){if(this.mEventStruct.DTEND||!this.mEventStruct.DURATION)return;var endDate=this.endDate();this.setPropertyValue('DURATION',null);this.setEndDate(endDate);},location:function(){return this.valueForProperty('LOCATION');},setLocation:function(inLocation){this.setPropertyValue('LOCATION',inLocation);},summary:function(){return this.valueForProperty('SUMMARY');},setSummary:function(inSummary){this.setPropertyValue('SUMMARY',inSummary);},description:function(){return this.valueForProperty('DESCRIPTION');},setDescription:function(inDescription){this.setPropertyValue('DESCRIPTION',inDescription);},originalEventFromRecurrence:function(inOptReturnBoolean){if(!this.mEventStruct['RECURRENCE-ID'])return null;if(inOptReturnBoolean)return true;var orig=this.mEventStruct['RECURRENCE-ID'].value;return this.mParentCalendarFile.mEvents.detect(function(evt){return(evt.uid==this.mEventStruct.UID.value);}.bind(this))||orig;},recurrenceID:function(){return this.valueForProperty('RECURRENCE-ID');},setRecurrenceID:function(inRecurrenceID){this.setPropertyValue('RECURRENCE-ID',inRecurrenceID);},recurrenceInfo:function(){if(!this.mRecurrenceInfo&&this.valueForProperty('RRULE')){this.mRecurrenceInfo=new CalendarRecurrence(this,this.valueForProperty('RRULE'));}
return this.mRecurrenceInfo;},setRecurrenceFrequency:function(inRecurrenceType){if(this.recurrenceInfo()&&(this.recurrenceInfo().frequency()==inRecurrenceType)){return;}
else if(inRecurrenceType.toUpperCase()=='CUSTOM'){return;}
else if((inRecurrenceType.toUpperCase()=='NONE')||!inRecurrenceType){this.setPropertyValue('RRULE',null);this.mRecurrenceInfo=null;return;}
this.mRecurrenceInfo=(inRecurrenceType?new CalendarRecurrence(this,'FREQ='+inRecurrenceType.toUpperCase()):null);this.setPropertyValue('RRULE',this.mRecurrenceInfo.updatedRecurrenceString());},exceptionDates:function(){if(!this.mEventStruct.EXDATE)return $A([]);return this.mEventStruct.findAll(function(param){return(param.key=='EXDATE');}).collect(function(exdateobj){if(!exdateobj.translatedValue){var dt=createDateObjFromISO8601(exdateobj.value);if(exdateobj.calAttrs&&exdateobj.calAttrs.TZID){exdateobj.translatedValue=timezoneService().correctDateForTimezone(exdateobj.value,exdateobj.calAttrs.TZID);}
else{exdateobj.translatedValue=exdateobj.value;}
exdateobj.translatedValue=createDateObjFromISO8601(exdateobj.translatedValue);}
return exdateobj.translatedValue;});},expandRecurrences:function(inStartDate,inEndDate,inCallback){return this.mParentCalendarFile.expandRecurrencesForEvent(this,inStartDate,inEndDate,inCallback);},visible:function(){if(this.mParentCalendarFile&&!this.mParentCalendarFile.mParentCalendar.mEnabled)return false;var dtTm=this.startDate().getTime();return this.mVisible&&(!this.exceptionDates().detect(function(dt){return dt.getTime()==dtTm;}));},setVisible:function(inIsVisible){this.mVisible=inIsVisible;},deleteFromServer:function(inCallback){return this.mParentCalendarFile.deleteEvent(inCallback);},createException:function(){var originalEvent=this.originalEventFromRecurrence()||this;var exc={key:'EXDATE',value:this.mEventStruct.DTSTART.value,calAttrs:this.mEventStruct.DTSTART.calAttrs};originalEvent.mEventStruct.push(exc);originalEvent.mEventStruct['EXDATE']=exc;originalEvent.updateStack().push('EXDATE');},detachRecurrence:function(inOptCreateException,inOptForceDetachOriginal){var originalEvent=this.originalEventFromRecurrence();if(inOptForceDetachOriginal&&!originalEvent)originalEvent=this;if(!originalEvent||!originalEvent.recurrenceInfo())return null;var detachedFile=new CalendarFile(null,null,this.mParentCalendarFile.mParentCalendar);var detachedEvent=detachedFile.mEvents[0];var preservedValues=['UID','RECURRENCE-ID'];if(!this.organizerIsPrincipal()){preservedValues=[];this.mParentCalendarFile.mOriginalCalendarFile.mEvents.push(detachedEvent);this.mParentCalendarFile.mOriginalCalendarFile.mCalendarObj.VCALENDAR[0].VEVENT.push(detachedFile.mCalendarObj.VCALENDAR[0].VEVENT[0]);}
var alreadySetKeys=$A([]);for(var paramIdx=0;paramIdx<this.mEventStruct.length;paramIdx++){var param=this.mEventStruct[paramIdx];if(!param.key||!param.value)continue;if(preservedValues.indexOf(param.key)>=0)continue;if(alreadySetKeys.include(param.key)){detachedEvent.mEventStruct.push({key:param.key,value:param.value});if(param.calAttrs){detachedEvent.mEventStruct.last().calAttrs=Object.clone(param.calAttrs);}}
else{detachedEvent.setPropertyValue(param.key,param.value);if(param.calAttrs){detachedEvent.mEventStruct[param.key].calAttrs=Object.clone(param.calAttrs);}}
alreadySetKeys.push(param.key);}
detachedEvent.uid=detachedEvent.valueForProperty('UID');if(originalEvent==this&&!this.organizerIsPrincipal()){detachedEvent.setPropertyValue('RECURRENCE-ID',this.valueForProperty('DTSTART'));detachedEvent.setPropertyAttribute('RECURRENCE-ID','TZID',this.attributeForProperty('DTSTART','TZID'));detachedEvent.normalizeRecurrenceUID();var tempFile=new CalendarFile(null,null,this.mParentCalendarFile.mParentCalendar);var tempEvent=tempFile.mEvents[0];tempEvent.setPropertyValue('UID',this.valueForProperty('UID'));tempEvent.setPropertyValue('DTSTART',this.valueForProperty('DTSTART'));tempEvent.setPropertyAttribute('DTSTART','TZID',this.attributeForProperty('DTSTART','TZID'));tempEvent.setRecurrenceID(dateObjToISO8601(this.startDate(),true,true));tempEvent.uid=tempEvent.valueForProperty('UID')+'/'+tempEvent.recurrenceID();tempEvent.mParentCalendarFile=this.mParentCalendarFile;this.mParentCalendarFile.mEvents.push(tempEvent);this.mParentCalendarFile.mCalendarObj.VCALENDAR[0].VEVENT.push(tempFile.mCalendarObj.VCALENDAR[0].VEVENT[0]);}
this.revertToSaved(true);if(inOptCreateException&&this.organizerIsPrincipal()){this.createException();}
else if(this.organizerIsPrincipal()){var dt=createDateObjFromISO8601(this.mOriginalDateStruct[0].value);dt.setMinutes(dt.getMinutes()-1);dt=dateObjToISO8601(dt,false,true);originalEvent.recurrenceInfo().setUntil(dt);}
return detachedEvent;},organizer:function(){var org={uid:principalService().mUserPrincipalURL,displayname:(principalService().mUserPrincipalInfo?principalService().mUserPrincipalInfo.displayname:null)};if(this.valueForProperty('ORGANIZER')){org={uid:this.valueForProperty('ORGANIZER'),displayname:this.attributeForProperty('ORGANIZER','CN'),param:this.mEventStruct.ORGANIZER};}
return org;},organizerIsPrincipal:function(){var org=this.organizer();if(org.uid==principalService().mUserPrincipalURL)return true;return(principalService().mUserPrincipalInfo.calendarUserAddressSet.indexOf(org.uid)>=0);},attendees:function(){var attlist=$A([this.organizer()]);if(!this.mEventStruct.ATTENDEE)return attlist;var org=this.organizer();this.mEventStruct.each(function(param){if(param.key=='ATTENDEE'&&param.value!=org.uid){attlist.push({uid:param.value,displayname:(param.calAttrs?param.calAttrs.CN:null),status:(param.calAttrs?param.calAttrs.PARTSTAT:null),cutype:(param.calAttrs?param.calAttrs.CUTYPE:null),param:param});}});return attlist;},overallAttendeeStatus:function(){var attendees=this.attendees();var status=null;for(attIdx=0;attIdx<attendees.length;attIdx++){var att=attendees[attIdx];if(att.status&&(principalService().mUserPrincipalInfo.calendarUserAddressSet.indexOf(att.uid)<0)){if(status&&status!=att.status){return'MIXED';}
else{status=att.status;}}}
return status;},addAttendee:function(inAttendeeDict){if((principalService().mUserPrincipalURL==inAttendeeDict.uid&&!this.mEventStruct.ATTENDEE)||this.mEventStruct.detect(function(param){return(param.key=='ATTENDEE'&&param.value==inAttendeeDict.uid);}))return false;var originalEvent=this.originalEventFromRecurrence()||this;if(!this.valueForProperty('ORGANIZER')){this.setPropertyValue('ORGANIZER',principalService().mUserPrincipalURL);if(principalService().mUserPrincipalInfo&&principalService().mUserPrincipalInfo.displayname){this.setPropertyAttribute('ORGANIZER','CN',principalService().mUserPrincipalInfo.displayname);}}
var att={key:'ATTENDEE',value:inAttendeeDict.uid,calAttrs:{CN:inAttendeeDict.displayname,PARTSTAT:(inAttendeeDict.status||'NEEDS-ACTION')}};if(inAttendeeDict.cutype){att.calAttrs['CUTYPE']=inAttendeeDict.cutype;if(inAttendeeDict.cutype=='ROOM'&&(!inAttendeeDict.allowMultipleRooms)){this.removeRoomAttendee();}}
originalEvent.mEventStruct.push(att);originalEvent.mEventStruct['ATTENDEE']=att;originalEvent.updateStack().push('ATTENDEE');this.addAttendee(Object.extend(this.organizer(),{cutype:'INDIVIDUAL',status:'ACCEPTED'}));return true;},removeRoomAttendee:function(){for(var paramIdx=this.mEventStruct.length-1;paramIdx>=0;paramIdx--){var param=this.mEventStruct[paramIdx];if(param.key=='ATTENDEE'&&param.calAttrs&&param.calAttrs['CUTYPE']=='ROOM'){this.mEventStruct.splice(paramIdx,1);this.updateStack().push('ATTENDEE');return param.value;}}
return null;},removeAttendeeWithUID:function(inAttendeeUID){for(var paramIdx=0;paramIdx<this.mEventStruct.length;paramIdx++){var param=this.mEventStruct[paramIdx];if(param.key=='ATTENDEE'&&param.value==inAttendeeUID){this.mEventStruct.splice(paramIdx,1);this.updateStack().push('ATTENDEE');return true;}}
return false;},principalAttendee:function(){return this.attendees().detect(function(attendee){return(principalService().mUserPrincipalInfo.calendarUserAddressSet.indexOf(attendee.uid)>=0);});},participantStatus:function(){if(this.organizerIsPrincipal())return null;var pa=this.principalAttendee();return(pa&&pa.param&&pa.param.calAttrs?pa.param.calAttrs.PARTSTAT:null);},setParticipantStatus:function(inParticipantStatus){var pa=this.principalAttendee();if(!pa)return false;if(!pa.param.calAttrs)pa.param.calAttrs={};this.updateStack().push('ATTENDEE');pa.param.calAttrs.PARTSTAT=inParticipantStatus;if(this.valueForProperty('X-APPLE-NEEDS-REPLY')=='TRUE')this.setPropertyValue('X-APPLE-NEEDS-REPLY','FALSE');if(pa.param.calAttrs.RSVP)delete pa.param.calAttrs.RSVP;return true;},getFreeBusyReport:function(inCallback,inOptStartDate,inOptEndDate,inOptAttendees){if(!this.mFreeBusyLookupObj)this.mFreeBusyLookupObj=new FreeBusyLookup(this);var sd=inOptStartDate||this.startDate();var ed=inOptEndDate||getEndDateUsingDuration(this.startDate(),this.duration());this.mFreeBusyLookupObj.getFreeBusyForDateRange(sd,ed,inCallback,inOptAttendees);},fetchFullEventDetails:function(inCallback){this.mParentCalendarFile.fetchFullFileText(inCallback);},incrementSequenceNumber:function(){var existingSequenceNumber=this.valueForProperty('SEQUENCE');existingSequenceNumber=existingSequenceNumber&&existingSequenceNumber.match(/^\d/)?parseInt(existingSequenceNumber):0;this.setPropertyValue('SEQUENCE',''+(++existingSequenceNumber));},saveToServer:function(inCallback){var callback=function(transport){delete this.mDirty;this.mIsNew=false;if(inCallback)inCallback(transport);}
return this.mParentCalendarFile.saveToServer(callback.bind(this));},revertToSaved:function(inOptRevertDates){this.mParentCalendarFile.revertToSaved(inOptRevertDates);},moveToCalendar:function(inDestinationCalendar,inCallback){return this.mParentCalendarFile.moveToCalendar(inDestinationCalendar,inCallback);}}
var CalendarRecurrence=Class.create();CalendarRecurrence.prototype={initialize:function(inParentCalendarEvent,inRecurrenceString){this.mParentCalendarEvent=inParentCalendarEvent;this.mRecurrenceStruct={};$A(inRecurrenceString.split(';')).each(function(keyval){var setting=keyval.match(/^([^=]+)=(.*)$/);if(setting)this.mRecurrenceStruct[setting[1]]=setting[2];},this);},updatedRecurrenceString:function(){return $H(this.mRecurrenceStruct).collect(function(attr){return attr.key+'='+attr.value;}).join(';');},frequency:function(){return this.mRecurrenceStruct.FREQ;},isWeekdays:function(){var byday=this.mRecurrenceStruct.BYDAY;return(this.frequency()=='WEEKLY'&&byday&&byday.split(',').length==5&&!['MO','TU','WE','TH','FR'].detect(function(day){return(byday.indexOf(day)<0);}));},count:function(){return this.mRecurrenceStruct.COUNT;},setCount:function(inCount){if(this.mRecurrenceStruct.UNTIL)delete this.mRecurrenceStruct.UNTIL;if(!inCount||!inCount.match(/^\d/)){if(this.mRecurrenceStruct.COUNT)delete this.mRecurrenceStruct.COUNT;}
else{this.mRecurrenceStruct.COUNT=''+parseInt(inCount);}
this.mParentCalendarEvent.setPropertyValue('RRULE',this.updatedRecurrenceString());},until:function(inOptReturnRawFormat){if(!this.mRecurrenceStruct.UNTIL)return null;return(inOptReturnRawFormat?this.mRecurrenceStruct.UNITL:createDateObjFromISO8601(this.mRecurrenceStruct.UNTIL));},setUntil:function(inUntil,inBanner){if(inUntil&&inUntil.constructor!=String)inUntil=dateObjToISO8601(inUntil);inUntil=timezoneService().correctDateForTimezone(inUntil,this.mParentCalendarEvent.tzid(),true);if(inBanner)inUntil=removeTime(inUntil);if(this.mRecurrenceStruct.COUNT)delete this.mRecurrenceStruct.COUNT;if(!inUntil){if(this.mRecurrenceStruct.UNTIL)delete this.mRecurrenceStruct.UNTIL;}
else{this.mRecurrenceStruct.UNTIL=inUntil;}
this.mParentCalendarEvent.setPropertyValue('RRULE',this.updatedRecurrenceString());}}
FreeBusyLookup=Class.create();FreeBusyLookup.prototype={initialize:function(inParentCalendarEvent){this.mParentCalendarEvent=inParentCalendarEvent;},getFreeBusyForDateRange:function(inStartDate,inEndDate,inCallback,inOptAttendees){var attendees=inOptAttendees||this.mParentCalendarEvent.attendees();attendees=attendees.findAll(function(att){return(!att.uid.match(/^mailto:/));});var gotPrincipalInfoCallback=function(inPrincipalInfo){var reportString=String.format(FreeBusyLookup.defaultFormat,{DTSTAMP:dateObjToISO8601(new Date(),true,true),ORGANIZER:this.mParentCalendarEvent.organizer().uid,DTSTART:dateObjToISO8601(inStartDate,true,true),DTEND:dateObjToISO8601(inEndDate,true,true),UID:CalendarUuid.generateUUIDString(),attendees:attendees.collect(function(attendeeObj){return String.format('ATTENDEE%(cn)s:%(uid)s',{cn:(attendeeObj.displayname?';CN='+attendeeObj.displayname:''),uid:attendeeObj.uid});}).join('\n')});var reportCallback=function(transport){if(!transport.responseXML){reportError('Report response is missing responseXML. responseText = '+transport.responseText||'');return false;}
var freeBusyInfoForAttendees=$A([]);Element.childrenWithNodeName(Element.firstChildWithNodeName(transport.responseXML,'schedule-response'),'response').each(function(response){var recipient=Element.firstNodeValue(Element.elementWithSimpleXPath(response,'recipient.href'));var freeBusyObj={recipient:recipient,requestStatus:Element.firstNodeValue(Element.firstChildWithNodeName(response,'request-status'))};if(freeBusyObj.requestStatus=='2.0;Success'){freeBusyObj.blocks=$A([]);var calendarText=Element.firstNodeValue(Element.firstChildWithNodeName(response,'calendar-data'));var tempCalFile=new CalendarFile(calendarText,null,this.mParentCalendarEvent.mParentCalendarFile.mParentCalendar);tempCalFile.mCalendarObj.VCALENDAR[0].VFREEBUSY[0].each(function(prop){if(prop.key=='FREEBUSY'){$A(prop.value.split(',')).each(function(pair){var splitPair=pair.split('/');var duration=null;if(splitPair[1].match(/^P/)){duration=durationFromISO8601(splitPair[1]);}
else{duration=getDurationUsingEndDate(createDateObjFromISO8601(splitPair[0],true),createDateObjFromISO8601(splitPair[1],true));}
freeBusyObj.blocks.push({type:prop.calAttrs.FBTYPE,startDate:createDateObjFromISO8601(timezoneService().correctDateForTimezone(splitPair[0],null,false)),duration:duration});});}});freeBusyInfoForAttendees.push(freeBusyObj);}},this);if(inCallback)inCallback(freeBusyInfoForAttendees);}
return new Ajax.CalendarRequest(inPrincipalInfo.outboxurl,{method:'post',contentType:'text/calendar',postBody:reportString,recipients:attendees.pluck('uid'),requestHeaders:{originator:principalService().mUserPrincipalURL},onSuccess:reportCallback.bind(this),onException:reportError,errorNotificationObject:this});}
principalService().getPrincipalInfo(gotPrincipalInfoCallback.bind(this));}}
FreeBusyLookup.defaultFormat='BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//Apple Inc.//Web Calendar Client//\nMETHOD:REQUEST\n'
+'BEGIN:VFREEBUSY\nDTSTAMP:%(DTSTAMP)s\nORGANIZER:%(ORGANIZER)s\nDTSTART:%(DTSTART)s\nDTEND:%(DTEND)s\nUID:%(UID)s\n'
+'%(attendees)s\nEND:VFREEBUSY\nEND:VCALENDAR';FreeBusyLookup.emailAddressTest=/^(mailto:)*[^\s\/:]+@\S+\.\S+/;var UpcomingEventsService=Class.createWithSharedInstance('upcomingEventsService');UpcomingEventsService.DayRange=30;UpcomingEventsService.prototype={initialize:function()
{this.mEvents=[];this.mRemoteCalendarCollection=null;this.gotPrincipalInfo=this.gotPrincipalInfo.bind(this);this.gotCalendarCollection=this.gotCalendarCollection.bind(this);this.gotCalendarEvents=this.gotCalendarEvents.bind(this);principalService().getPrincipalInfo(this.gotPrincipalInfo);},gotPrincipalInfo:function()
{publisher().subscribe(this.gotCalendarCollection,'GOT_CALENDAR_COLLECTION');this.mRemoteCalendarCollection=new RemoteCalendarCollection(principalService().mUserPrincipalInfo.url+'/');},gotCalendarCollection:function(inNotificationType,inCalendarCollection)
{if(inCalendarCollection==this.mRemoteCalendarCollection){this.reload();}},reload:function()
{if(!this.mRemoteCalendarCollection)return;var start=new Date();var end=new Date();end.setDate(start.getDate()+UpcomingEventsService.DayRange);this.mRemoteCalendarCollection.getEventsForDateRange(start,end,this.gotCalendarEvents);},gotCalendarEvents:function(inRequest,inCalendarEvents)
{var timezoneCallback=function(){publisher().publish('GOT_UPCOMING_EVENTS',this.mEvents);}.bind(this);this.mEvents=inCalendarEvents;var timezoneEvents=this.mEvents.clone();timezoneService().fetchOffsetsForEvents(timezoneCallback,timezoneEvents);}};var CalendarUuid=Class.create();CalendarUuid.prototype={initialize:function(){var olderDate=new Date(1582,10,15,0,0,0,0);var now=new Date();var msec=now.valueOf()-olderDate.valueOf();var nic=padNumberStr(hex_hmac_md5(this.getShiftedBits(this.getRandomNumberInRange(0,4095),0,16),location.href),12).substring(0,12);var uidArray=[this.getShiftedBits(msec,0,8),this.getShiftedBits(msec,8,12),this.getShiftedBits(msec,12,19)+'1',this.getShiftedBits(this.getRandomNumberInRange(0,4095),0,2)+this.getShiftedBits(this.getRandomNumberInRange(0,4095),0,2),nic];this.mStringValue=uidArray.join('-');},getRandomNumberInRange:function(inMin,inMax){return Math.min(Math.max(Math.round((Math.random()*(inMin+inMax))-inMin),inMin),inMax);},getShiftedBits:function(inValue,inStart,inEnd){var base16str=padNumberStr(inValue.toString(16),inEnd);return base16str.substring(inStart,inEnd);},toString:function(){return this.mStringValue;}}
CalendarUuid.generateUUIDString=function(){return(new CalendarUuid()).toString();}
Ajax.getTransport=function(){return window.ActiveXObject?new ActiveXObject('Msxml2.XMLHTTP'):new XMLHttpRequest();}
Ajax.CalendarRequest=Class.create();Object.extend(Object.extend(Ajax.CalendarRequest.prototype,Ajax.Request.prototype),{setRequestRecipients:function(){if(this.options.recipients){$A(this.options.recipients).each(function(recipient){this.transport.setRequestHeader('Recipient',recipient);},this);}},request:function(url){if(!this.options.onFailure&&this.options.errorNotificationObject){this.options.on0=function(){if(!publisher().publish('ERROR_FROM_SERVER',this.options.errorNotificationObject,{request:this,errorObj:this}))dispatchException(this);}.bind(this);this.options.onFailure=function(e){if(!publisher().publish('ERROR_FROM_SERVER',this.options.errorNotificationObject,{request:this,errorObj:e}))dispatchException(e);}.bind(this);}
this.url=url;this.method=this.options.method;var params=Object.clone(this.options.parameters);this.parameters=params;if(params=Hash.toQueryString(params)){if(this.method=='get')
this.url+=(this.url.include('?')?'&':'?')+params;else if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
params+='&_=';}
try{if(this.options.onCreate)this.options.onCreate(this.transport);Ajax.Responders.dispatch('onCreate',this,this.transport);if(IEFixes.isIE&&Ajax.CalendarRequest.gimpedIEMethods.include(this.method.toUpperCase())){this.actualMethod=this.method.toUpperCase();this.method='POST';}
this.transport.open(this.method.toUpperCase(),this.url,this.options.asynchronous);if(this.options.asynchronous)
setTimeout(function(){this.respondToReadyState(1)}.bind(this),10);this.transport.onreadystatechange=this.onStateChange.bind(this);this.setRequestHeaders();if(this.actualMethod)this.transport.setRequestHeader('X-HTTP-Method-Override',this.actualMethod);this.setRequestRecipients();this.body=this.method=='get'?null:(this.options.postBody||params);this.transport.send(this.body);if(!this.options.asynchronous&&this.transport.overrideMimeType)
this.onStateChange();}
catch(e){this.dispatchException(e);}},success:function(){var status=this.getStatus();return(!status||(status>=200&&status<300)||(IEFixes.isIE&&status==1223));}});Ajax.CalendarRequest.gimpedIEMethods=$A(['REPORT','MKCALENDAR']);if(window.loaded)loaded('caldav.js');