Changeset 2963
- Timestamp:
- 08/04/10 11:08:21
- Files:
-
- trunk/deployment/resources/javascript/jquery/autocomplete/bw-jquery.autocomplete.js (modified) (1 diff)
- trunk/deployment/webuser/webapp/resources/demoskins/themes/bedeworkTheme/css/bwScheduling.css (modified) (1 diff)
- trunk/deployment/webuser/webapp/resources/demoskins/themes/bedeworkTheme/head.xsl (modified) (1 diff)
- trunk/deployment/webuser/webapp/resources/demoskins/themes/bedeworkTheme/javascript/bedeworkAttendees.js (modified) (3 diffs)
- trunk/deployment/webuser/webapp/resources/demoskins/themes/bedeworkTheme/javascript/bedeworkScheduling.js (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/deployment/resources/javascript/jquery/autocomplete/bw-jquery.autocomplete.js
r2050 r2963 314 314 315 315 function receiveData(q, data) { 316 if ( data && data.length && hasFocus ) {316 if ( data && data.length && hasFocus && data[0] != undefined) { 317 317 stopLoading(); 318 318 select.display(data, q); trunk/deployment/webuser/webapp/resources/demoskins/themes/bedeworkTheme/css/bwScheduling.css
r2953 r2963 108 108 } 109 109 #bwScheduleTable #bwAddAttendeeFields { 110 margin: auto; 111 width: 170px; 110 white-space: nowrap; 112 111 } 113 112 #bwScheduleTable .bwAddAttendeeSubField { 114 float: left;115 113 font-size: 0.9em; 116 114 margin: 0.5em 0.25em; 117 115 } 118 116 #bwScheduleTable .bwAddAttendeeSubFieldHead { 119 text-align: center;120 background-color: #eee;121 color: black;122 117 } 123 118 #bwScheduleTable #attType { trunk/deployment/webuser/webapp/resources/demoskins/themes/bedeworkTheme/head.xsl
r2950 r2963 186 186 var bwGridAttees = new Array(<xsl:apply-templates select="/bedework/formElements/form/attendees" mode="loadBwGrid"/>); 187 187 var bwGridOrganizer = "<xsl:value-of select="/bedework/formElements/form/organizer/organizerUri"/>"; 188 var bwGrid = new bwSchedulingGrid("bwFreeBusyDisplay",bwGridSDate,8,17,bwGridAttees,true,100,"<xsl:value-of select="$resourcesRoot"/>","<xsl:value-of select="$requestFreeBusy"/>","<xsl:value-of select="$event-attendeesForEvent"/>",bwGridOrganizer); 188 var bwGridCurUser = "<xsl:value-of select="/bedework/userid"/>"; 189 var bwGrid = new bwSchedulingGrid("bwFreeBusyDisplay",bwGridSDate,8,17,bwGridAttees,true,100,"<xsl:value-of select="$resourcesRoot"/>","<xsl:value-of select="$requestFreeBusy"/>","<xsl:value-of select="$event-attendeesForEvent"/>",bwGridOrganizer,bwGridCurUser); 189 190 190 191 // set the grid size trunk/deployment/webuser/webapp/resources/demoskins/themes/bedeworkTheme/javascript/bedeworkAttendees.js
r2953 r2963 26 26 extraParams: { 27 27 format: 'json', 28 addrbook: '/public/locations' 29 //addrbook: '/user/johnsa/addressbook' 28 addrbook: function() { return $("#bwCardDavBookPath").val(); } 30 29 }, 31 30 … … 37 36 parse: function(data) { 38 37 var parsed = []; 39 data = data.microformats.vcard; 40 for (var i = 0; i < data.length; i++) { 41 42 // pick out the best uri if one is available 43 // caladruri is first choice, email second 44 var cururi = ""; 45 if (data[i].caladruri != undefined && data[i].caladruri.value != undefined) { 46 cururi = data[i].caladruri.value; 47 } 48 if (cururi == "" && data[i].email[0] != undefined && data[i].email[0].value != undefined) { 49 var curEmail = data[i].email[0].value; 50 if (curEmail != "") { 51 cururi = "mailto:" + curEmail; 38 if (data.microformats != undefined && data.microformats.vcard != undefined) { 39 data = data.microformats.vcard; 40 for (var i = 0; i < data.length; i++) { 41 42 // pick out the best uri if one is available 43 // caladruri is first choice, email second 44 var cururi = ""; 45 if (data[i].caladruri != undefined && data[i].caladruri.value != undefined) { 46 cururi = data[i].caladruri.value; 52 47 } 53 } 54 // check for the existence of fn 55 var curfn = ""; 56 if (data[i].fn != undefined && data[i].fn.value != undefined) { 57 curfn = data[i].fn.value; 58 } 59 60 // check for the existence of kind 61 var curkind = ""; 62 if (data[i].kind != undefined && data[i].kind.value != undefined) { 63 curkind = data[i].kind.value; 64 } 65 66 // skip if no uri 67 if (cururi != "") { 68 dataRow = { 69 fn: curfn, 70 uri: cururi, 71 type: curkind 72 }; 73 parsed[i] = { 74 data: dataRow, 75 value: curfn, 76 result: cururi 77 }; 48 if (cururi == "" && data[i].email != undefined && data[i].email[0] != undefined && data[i].email[0].value != undefined) { 49 var curEmail = data[i].email[0].value; 50 if (curEmail != "") { 51 cururi = "mailto:" + curEmail; 52 } 53 } 54 // check for the existence of fn 55 var curfn = ""; 56 if (data[i].fn != undefined && data[i].fn.value != undefined) { 57 curfn = data[i].fn.value; 58 } 59 60 // check for the existence of kind 61 var curkind = ""; 62 if (data[i].kind != undefined && data[i].kind.value != undefined) { 63 curkind = data[i].kind.value; 64 } 65 66 // skip if no uri 67 if (cururi != "") { 68 dataRow = { 69 fn: curfn, 70 uri: cururi, 71 type: curkind 72 }; 73 parsed[i] = { 74 data: dataRow, 75 value: curfn, 76 result: cururi 77 }; 78 } 78 79 } 79 80 } … … 81 82 }, 82 83 formatItem: function(item) { 83 return " \"" + item.fn + "\" [" + item.uri.substring(7) + "]";84 return " " + item.fn + " - " + item.uri.substring(7); 84 85 }, 85 86 86 87 formatMatch: function(item) { 87 return " \"" + item.fn + "\" [" + item.uri.substring(7) + "]";88 return " " + item.fn + " - " + item.uri.substring(7); 88 89 }, 89 90 formatResult: function(item) { trunk/deployment/webuser/webapp/resources/demoskins/themes/bedeworkTheme/javascript/bedeworkScheduling.js
r2953 r2963 18 18 */ 19 19 20 21 // ======================================================================== 22 // free/busy functions 23 // ======================================================================== 20 /* ======================================================================== 21 This file builds a scheduling widget for the "meeting" tab of the 22 add/edit event form used for adding and removing attendees, observing 23 free/busy, and for picking available time in a free/busy grid. 24 ======================================================================== 25 */ 24 26 25 27 // Constants and RFC-5445 values … … 64 66 var bwAttendeeExistsDisp = "attendee exists"; 65 67 var bwAddAttendeeRoleDisp = "Role:"; 66 var bwAddAttendeeTypeDisp = "Type ";67 var bwAddAttendeeBookDisp = "Book ";68 var bwAddAttendeeTypeDisp = "Type:"; 69 var bwAddAttendeeBookDisp = "Book:"; 68 70 var bwEventSubmitMeetingDisp = "send"; 69 71 … … 193 195 * organizerUri: string - e.g. "someone@mysite.edu" 194 196 */ 195 var bwSchedulingGrid = function(displayId, startRange, startHoursRange, endHoursRange, attendees, workday, zoom, browserResourcesRoot, fbUrlPrefix, attUrlPrefix, organizerUri ) {197 var bwSchedulingGrid = function(displayId, startRange, startHoursRange, endHoursRange, attendees, workday, zoom, browserResourcesRoot, fbUrlPrefix, attUrlPrefix, organizerUri, curUserId) { 196 198 this.displayId = displayId; 197 199 this.startRange = new Date(startRange); … … 207 209 this.attUrlPrefix = attUrlPrefix; 208 210 this.organizer = organizerUri; 211 this.curUser = curUserId; 209 212 210 213 // increment the endRange … … 663 666 } 664 667 668 // generate the "add attendee" row 669 fbDisplayAddAttendeeRow = fbDisplay.insertRow(fbDisplay.rows.length); 670 671 // create the add attendee form 672 var addAttendeeHtml = '<td class="addAttendee" colspan="4">'; 673 addAttendeeHtml += '<input type="text" value="' + bwAddAttendeeDisp +'" name="q" id="bwAddAttendee" class="pending" size="30"/>'; 674 addAttendeeHtml += '<span id="bwAddAttendeeAdd" class="invisible">' + bwAddDisp +'</span>'; 675 //addAttendeeHtml += '<span id="bwAddAttendeeAdvanced">advanced</span>'; 676 addAttendeeHtml += '<div id="bwAddAttendeeFields" class="invisible">'; 677 addAttendeeHtml += ' <div class="bwAddAttendeeSubField" id="bwAddAttendeeRoleBlock">'; 678 addAttendeeHtml += ' <span class="bwAddAttendeeSubFieldHead">' + bwAddAttendeeRoleDisp + '</span>'; 679 addAttendeeHtml += ' <select name="role" id="bwAddAttendeeRole">'; 680 addAttendeeHtml += ' <option value="REQ-PARTICIPANT">' + bwReqParticipantDisp + '</option>'; 681 addAttendeeHtml += ' <option value="OPT-PARTICIPANT">' + bwOptParticipantDisp + '</option>'; 682 addAttendeeHtml += ' <option value="CHAIR">' + bwChairDisp + '</option>'; 683 addAttendeeHtml += ' <option value="NON-PARTICIPANT">' + bwNonParticipant + '</option>'; 684 addAttendeeHtml += ' </select>'; 685 addAttendeeHtml += ' </div>'; 686 // DON'T include partstat except for testing. This value should be determined by actual participants. 687 //addAttendeeHtml += '<select name="partstat" id="bwAddAttendeePartstat">'; 688 //addAttendeeHtml += ' <option value="NEEDS-ACTION">' + bwNeedsAction + '</option>'; 689 //addAttendeeHtml += ' <option value="ACCEPTED">' + bwAccepted + '</option>'; 690 //addAttendeeHtml += ' <option value="DECLINED">' + bwDeclined + '</option>'; 691 //addAttendeeHtml += ' <option value="TENTATIVE">' + bwTentative + '</option>'; 692 //addAttendeeHtml += ' <option value="DELEGATED">' + bwDelegated + '</option>'; 693 //addAttendeeHtml += '</select>'; 694 addAttendeeHtml += ' <div class="bwAddAttendeeSubField" id="bwAddAttendeeBookBlock">'; 695 addAttendeeHtml += ' <span class="bwAddAttendeeSubFieldHead">' + bwAddAttendeeBookDisp + '</span>'; 696 addAttendeeHtml += ' <input type="radio" name="bwAddAttendeeAddrBk" value="/user/' + bwGrid.curUser + '/addressbook" checked="checked" onclick="changeClass(\'bwAddAttendeeTypeBlock\',\'invisible\');bwGrid.updateBookPath(this.value);">personal'; 697 addAttendeeHtml += ' <input type="radio" name="bwAddAttendeeAddrBk" value="/public" onclick="changeClass(\'bwAddAttendeeTypeBlock\',\'bwAddAttendeeSubField\');bwGrid.updateBookPath(this.form.bwAddAttendeeType.value);">public'; 698 addAttendeeHtml += ' </div>'; 699 addAttendeeHtml += ' <div class="invisible" id="bwAddAttendeeTypeBlock">'; 700 addAttendeeHtml += ' <span class="bwAddAttendeeSubFieldHead">' + bwAddAttendeeTypeDisp + '</span>'; 701 addAttendeeHtml += ' <input type="radio" name="bwAddAttendeeType" value="/public/people" checked="checked" onclick="bwGrid.updateBookPath(this.value);"/>person'; 702 addAttendeeHtml += ' <input type="radio" name="bwAddAttendeeType" value="/public/groups" disabled="disabled" onclick="bwGrid.updateBookPath(this.value);"/>group'; 703 addAttendeeHtml += ' <input type="radio" name="bwAddAttendeeType" value="/public/locations" onclick="bwGrid.updateBookPath(this.value);"/>location'; 704 addAttendeeHtml += ' </div>'; 705 addAttendeeHtml += ' <input type="hidden" name="bwCardDavBookPath" id="bwCardDavBookPath" value="/user/' + bwGrid.curUser + '/addressbook"/>'; 706 addAttendeeHtml += '</div>'; 707 addAttendeeHtml += '</td><td class="fbBoundry"></td>'; 708 709 $(fbDisplayAddAttendeeRow).html(addAttendeeHtml); 710 711 for (i = 0; i < range; i++) { 712 var curDate = new Date(this.startRange); 713 curDate.setHours(startHour); 714 curDate.addDays(i); 715 // add the time cells by iterating over the hours 716 for (j = 0; j < hourRange; j++) { 717 for (k = 0; k < this.hourDivision; k++) { 718 var fbCell = document.createElement("td"); 719 fbCell.id = curDate.getTime() + "-add"; 720 $(fbCell).addClass("fbcell"); 721 $(fbCell).addClass(curDate.getTime().toString()); 722 if (curDate.getMinutes() == 0 && j != 0) { 723 $(fbCell).addClass("hourBoundry"); 724 } 725 $(fbDisplayAddAttendeeRow).append(fbCell); 726 curDate.addMinutes(60/this.hourDivision); 727 } 728 } 729 $(fbDisplayAddAttendeeRow).append('<td class="dayBoundry"></td>'); 730 } 731 665 732 // generate the regular attendees rows 666 733 for (attendee = 0; attendee < this.attendees.length; attendee++) { … … 780 847 } 781 848 782 // generate the "add attendee" row783 fbDisplayAddAttendeeRow = fbDisplay.insertRow(fbDisplay.rows.length);784 785 // create the add attendee form786 var addAttendeeHtml = '<td class="addAttendee" colspan="4">';787 addAttendeeHtml += '<input type="text" value="' + bwAddAttendeeDisp +'" name="q" id="bwAddAttendee" class="pending" size="30"/>';788 addAttendeeHtml += '<span id="bwAddAttendeeAdd" class="invisible">' + bwAddDisp +'</span>';789 //addAttendeeHtml += '<span id="bwAddAttendeeAdvanced">advanced</span>';790 addAttendeeHtml += '<div id="bwAddAttendeeFields" class="invisible">';791 addAttendeeHtml += ' ' + bwAddAttendeeRoleDisp + ' ';792 addAttendeeHtml += ' <select name="role" id="bwAddAttendeeRole">';793 addAttendeeHtml += ' <option value="REQ-PARTICIPANT">' + bwReqParticipantDisp + '</option>';794 addAttendeeHtml += ' <option value="OPT-PARTICIPANT">' + bwOptParticipantDisp + '</option>';795 addAttendeeHtml += ' <option value="CHAIR">' + bwChairDisp + '</option>';796 addAttendeeHtml += ' <option value="NON-PARTICIPANT">' + bwNonParticipant + '</option>';797 addAttendeeHtml += ' </select>';798 // DON'T include partstat except for testing. This value should be determined by actual participants.799 //addAttendeeHtml += '<select name="partstat" id="bwAddAttendeePartstat">';800 //addAttendeeHtml += ' <option value="NEEDS-ACTION">' + bwNeedsAction + '</option>';801 //addAttendeeHtml += ' <option value="ACCEPTED">' + bwAccepted + '</option>';802 //addAttendeeHtml += ' <option value="DECLINED">' + bwDeclined + '</option>';803 //addAttendeeHtml += ' <option value="TENTATIVE">' + bwTentative + '</option>';804 //addAttendeeHtml += ' <option value="DELEGATED">' + bwDelegated + '</option>';805 //addAttendeeHtml += '</select>';806 addAttendeeHtml += ' <div class="bwAddAttendeeSubField">';807 addAttendeeHtml += ' <div class="bwAddAttendeeSubFieldHead">' + bwAddAttendeeTypeDisp + '</div>';808 addAttendeeHtml += ' <input type="radio" name="bwAddAttendeeType" value="person" checked="checked">person<br/>';809 addAttendeeHtml += ' <input type="radio" name="bwAddAttendeeType" value="group" disabled="disabled">group<br/>';810 addAttendeeHtml += ' <input type="radio" name="bwAddAttendeeType" value="location"/>location';811 addAttendeeHtml += ' </div>';812 addAttendeeHtml += ' <div class="bwAddAttendeeSubField">';813 addAttendeeHtml += ' <div class="bwAddAttendeeSubFieldHead">' + bwAddAttendeeBookDisp + '</div>';814 addAttendeeHtml += ' <input type="radio" name="bwAddAttendeeAddrBk" value="person" checked="checked">personal<br/>';815 addAttendeeHtml += ' <input type="radio" name="bwAddAttendeeAddrBk" value="group">public<br/>';816 addAttendeeHtml += ' </div>';817 addAttendeeHtml += '</div>';818 addAttendeeHtml += '</td><td class="fbBoundry"></td>';819 820 $(fbDisplayAddAttendeeRow).html(addAttendeeHtml);821 822 for (i = 0; i < range; i++) {823 var curDate = new Date(this.startRange);824 curDate.setHours(startHour);825 curDate.addDays(i);826 // add the time cells by iterating over the hours827 for (j = 0; j < hourRange; j++) {828 for (k = 0; k < this.hourDivision; k++) {829 var fbCell = document.createElement("td");830 fbCell.id = curDate.getTime() + "-add";831 $(fbCell).addClass("fbcell");832 $(fbCell).addClass(curDate.getTime().toString());833 if (curDate.getMinutes() == 0 && j != 0) {834 $(fbCell).addClass("hourBoundry");835 }836 $(fbDisplayAddAttendeeRow).append(fbCell);837 curDate.addMinutes(60/this.hourDivision);838 }839 }840 $(fbDisplayAddAttendeeRow).append('<td class="dayBoundry"></td>');841 }842 843 849 // generate a blank row at the end (this is just for visual padding) 844 850 fbDisplayBlankRow = fbDisplay.insertRow(fbDisplay.rows.length); … … 938 944 } 939 945 ); 946 947 this.updateBookPath = function(path) { 948 $("#bwCardDavBookPath").val(path); 949 } 940 950 941 951 this.gotoNextRange = function() { … … 1048 1058 var carddavUrlTemp = "/ucalrsrc/themes/bedeworkTheme/javascript/addrbookUsers.js" 1049 1059 //var carddavUrlTemp = "/ucalrsrc/themes/bedeworkTheme/javascript/addrbookLocations.js" 1050 $("#bwScheduleTable #bwAddAttendee").autocomplete(carddavUrl Temp, bwAutoCompleteOptions);1060 $("#bwScheduleTable #bwAddAttendee").autocomplete(carddavUrl, bwAutoCompleteOptions); 1051 1061 1052 1062 // capture the enter key when entering an attendee; … … 1054 1064 $("#bwScheduleTable #bwAddAttendee").keypress ( 1055 1065 function (e) { 1056 if(e.keyCode == 13) { 1066 if(e.keyCode == 13) { // enter 1057 1067 e.preventDefault(); 1058 1068 bwGrid.addAttendeeFromGrid();
