PageRenderTime 62ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/code/war/js/coordinator.js

https://code.google.com/p/teammatespes/
JavaScript | 2796 lines | 2069 code | 441 blank | 286 comment | 399 complexity | d5791c6237f7a0006bc1ac948838dbc9 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. // AJAX
  2. var xmlhttp = new getXMLObject();
  3. // DATE OBJECT
  4. var cal = new CalendarPopup();
  5. // DISPLAY
  6. var DISPLAY_COURSE_ADDED = "The course has been added. Click the 'Enrol' link in the table below to add students to the course.";
  7. var DISPLAY_COURSE_ARCHIVED = "The course has been archived.";
  8. var DISPLAY_COURSE_DELETED = "The course has been deleted."
  9. var DISPLAY_COURSE_DELETEDALLSTUDENTS = "All students have been removed from the course.";
  10. var DISPLAY_COURSE_EXISTS = "<font color=\"#F00\">The course already exists.</font>";
  11. var DISPLAY_COURSE_INVALIDID = "<font color=\"#F00\">Please use only alphabets, numbers, dots and hyphens in COURSE ID.</font>";
  12. var DISPLAY_COURSE_NOTEAMS = "<font color=\"#F00\">The course does not have any teams.</font>";
  13. var DISPLAY_COURSE_SENTREGISTRATIONKEY = "Registration key has been sent to ";
  14. var DISPLAY_COURSE_SENTREGISTRATIONKEYS = "Registration keys are sent to the students.";
  15. var DISPLAY_COURSE_INVALIDNAME = "<font color=\"#F00\">Course name should not exceed 30 characters.</font>";
  16. var DISPLAY_COURSE_UNARCHIVED = "The course has been unarchived.";
  17. var DISPLAY_EDITSTUDENT_FIELDSEMPTY = "<font color=\"#F00\">Please fill in all fields marked with an *.</font>";
  18. var DISPLAY_ENROLLMENT_FIELDSEXTRA = "<font color=\"#F00\">There are too many fields.</font>";
  19. var DISPLAY_ENROLLMENT_FIELDSMISSING = "<font color=\"#F00\">There are missing fields.</font>";
  20. var DISPLAY_EVALUATION_ADDED = "The evaluation has been added.";
  21. var DISPLAY_EVALUATION_ARCHIVED = "The evaluation has been archived.";
  22. var DISPLAY_EVALUATION_DELETED = "The evaluation has been deleted.";
  23. var DISPLAY_EVALUATION_EDITED = "The evaluation has been edited.";
  24. var DISPLAY_EVALUATION_EXISTS = "<font color=\"#F00\">The evaluation exists already.</font>";
  25. var DISPLAY_EVALUATION_INFORMEDSTUDENTSOFCHANGES = "E-mails have been sent out to inform the students of the changes to the evaluation.";
  26. var DISPLAY_EVALUATION_NAMEINVALID = "<font color=\"#F00\">Please use only alphabets, numbers and whitespace in EVALUATION NAME.</font>";
  27. var DISPLAY_EVALUATION_PUBLISHED = "The evaluation has been published.";
  28. var DISPLAY_EVALUATION_UNPUBLISHED = "The evaluation has been unpublished.";
  29. var DISPLAY_EVALUATION_REMINDERSSENT = "Reminder e-mails have been sent out to those students.";
  30. var DISPLAY_EVALUATION_RESULTSEDITED = "The particular evaluation results have been edited.";
  31. var DISPLAY_EVALUATION_SCHEDULEINVALID = "<font color=\"#F00\">The evaluation schedule (start/deadline) is not valid.</font>";
  32. var DISPLAY_EVALUATION_UNARCHIVED = "The evaluation has been unarchived.";
  33. var DISPLAY_FIELDS_EMPTY = "<font color=\"#F00\">Please fill in all the relevant fields.</font>";
  34. var DISPLAY_LOADING = "<b>Loading ...</b> <img src=images/ajax-loader.gif /><br />";
  35. var DISPLAY_SERVERERROR = "Connection to the server has timed out. Please refresh the page.";
  36. var DISPLAY_STUDENT_DELETED = "The student has been removed.";
  37. var DISPLAY_STUDENT_EDITED = "The student's details have been edited.";
  38. var DISPLAY_STUDENT_EDITEDEXCEPTTEAM = "The student's details have been edited, except for his team<br /> as there is an ongoing evaluation."
  39. var DISPLAY_STUDENT_EMAILINVALID = "<font color=\"#F00\">E-mail address should contain less than 40 characters and be of a valid syntax.</font>";
  40. var DISPLAY_STUDENT_NAMEINVALID = "<font color=\"#F00\">Name should only consist of alphabets and numbers and not<br />be more than 40 characters.</font>";
  41. var DISPLAY_STUDENT_TEAMNAMEINVALID = "<font color=\"#F00\">Team name should contain less than 25 characters.</font>";
  42. // DIV
  43. var DIV_COURSE_INFORMATION = "coordinatorCourseInformation";
  44. var DIV_COURSE_ENROLLMENT = "coordinatorCourseEnrollment";
  45. var DIV_COURSE_ENROLLMENTBUTTONS = "coordinatorCourseEnrollmentButtons";
  46. var DIV_COURSE_ENROLLMENTRESULTS = "coordinatorCourseEnrollmentResults";
  47. var DIV_COURSE_MANAGEMENT = "coordinatorCourseManagement";
  48. var DIV_COURSE_TABLE = "coordinatorCourseTable";
  49. var DIV_EVALUATION_EDITBUTTONS = "coordinatorEditEvaluationButtons";
  50. var DIV_EVALUATION_EDITRESULTS = "coordinatorEditEvaluationResults";
  51. var DIV_EVALUATION_EDITRESULTSBUTTON = "coordinatorEditEvaluationResultsButtons";
  52. var DIV_EVALUATION_INFORMATION = "coordinatorEvaluationInformation";
  53. var DIV_EVALUATION_MANAGEMENT = "coordinatorEvaluationManagement";
  54. var DIV_EVALUATION_SUMMARYTABLE = "coordinatorEvaluationSummaryTable";
  55. var DIV_EVALUATION_TABLE = "coordinatorEvaluationTable";
  56. var DIV_HEADER_OPERATION = "headerOperation";
  57. var DIV_STUDENT_EDITBUTTONS = "coordinatorEditStudentButtons";
  58. var DIV_STUDENT_INFORMATION = "coordinatorStudentInformation";
  59. var DIV_STUDENT_TABLE = "coordinatorStudentTable";
  60. var DIV_STATUS_EDITEVALUATIONRESULTS = "coordinatorEditEvaluationResultsStatusMessage";
  61. var DIV_TOPOFPAGE = "topOfPage";
  62. // GLOBAL VARIABLES FOR GUI
  63. var courseSort = { ID:0, name:1 }
  64. var courseSortStatus = courseSort.ID;
  65. var evaluationSort = { courseID:0, name:1 }
  66. var evaluationSortStatus = evaluationSort.courseID;
  67. var studentSort = { name:0, teamName:1, status: 2}
  68. var studentSortStatus = studentSort.name;
  69. var courseViewArchived = { show:0, hide:1 }
  70. var courseViewArchivedStatus = courseViewArchived.hide;
  71. var evaluationResultsView = { reviewee:0, reviewer:1 }
  72. var evaluationResultsViewStatus = evaluationResultsView.reviewee;
  73. var evaluationResultsSummaryListSort = { teamName:0, name:1, average:2, submitted:3, diff:4 }
  74. var evaluationResultsSummaryListSortStatus = evaluationResultsSummaryListSort.teamName;
  75. // MESSAGES
  76. var MSG_COURSE_EXISTS = "course exists";
  77. var MSG_COURSE_NOTEAMS = "course has no teams";
  78. var MSG_EVALUATION_ADDED = "evaluation added";
  79. var MSG_EVALUATION_EDITED = "evaluation edited";
  80. var MSG_EVALUATION_EXISTS = "evaluation exists";
  81. var MSG_EVALUATION_UNABLETOCHANGETEAMS = "evaluation ongoing unable to change teams";
  82. // OPERATIONS
  83. var OPERATION_COORDINATOR_ADDCOURSE = "coordinator_addcourse";
  84. var OPERATION_COORDINATOR_ADDEVALUATION = "coordinator_addevaluation";
  85. var OPERATION_COORDINATOR_ARCHIVECOURSE = "coordinator_archivecourse";
  86. var OPERATION_COORDINATOR_ARCHIVEEVALUATION = "coordinator_archiveevaluation";
  87. var OPERATION_COORDINATOR_DELETEALLSTUDENTS = "coordinator_deleteallstudents";
  88. var OPERATION_COORDINATOR_DELETECOURSE = "coordinator_deletecourse";
  89. var OPERATION_COORDINATOR_DELETEEVALUATION = "coordinator_deleteevaluation";
  90. var OPERATION_COORDINATOR_DELETESTUDENT = "coordinator_deletestudent";
  91. var OPERATION_COORDINATOR_EDITEVALUATION = "coordinator_editevaluation";
  92. var OPERATION_COORDINATOR_EDITEVALUATIONRESULTS = "coordinator_editevaluationresults";
  93. var OPERATION_COORDINATOR_EDITSTUDENT = "coordinator_editstudent";
  94. var OPERATION_COORDINATOR_ENROLSTUDENTS = "coordinator_enrolstudents";
  95. var OPERATION_COORDINATOR_GETCOURSE = "coordinator_getcourse";
  96. var OPERATION_COORDINATOR_GETCOURSELIST = "coordinator_getcourselist";
  97. var OPERATION_COORDINATOR_GETEVALUATIONLIST = "coordinator_getevaluationlist";
  98. var OPERATION_COORDINATOR_GETSTUDENTLIST = "coordinator_getstudentlist";
  99. var OPERATION_COORDINATOR_GETSUBMISSIONLIST = "coordinator_getsubmissionlist";
  100. var OPERATION_COORDINATOR_INFORMSTUDENTSOFEVALUATIONCHANGES = "coordinator_informstudentsofevaluationchanges";
  101. var OPERATION_COORDINATOR_LOGOUT = "coordinator_logout";
  102. var OPERATION_COORDINATOR_PUBLISHEVALUATION = "coordinator_publishevaluation";
  103. var OPERATION_COORDINATOR_UNPUBLISHEVALUATION = "coordinator_unpublishevaluation";
  104. var OPERATION_COORDINATOR_REMINDSTUDENTS = "coordinator_remindstudents";
  105. var OPERATION_COORDINATOR_SENDREGISTRATIONKEY = "coordinator_sendregistrationkey";
  106. var OPERATION_COORDINATOR_SENDREGISTRATIONKEYS = "coordinator_sendregistrationkeys";
  107. var OPERATION_COORDINATOR_UNARCHIVECOURSE = "coordinator_unarchivecourse";
  108. var OPERATION_COORDINATOR_UNARCHIVEEVALUATION = "coordinator_unarchiveevaluation";
  109. // PARAMETERS
  110. var COURSE_ID = "courseid";
  111. var COURSE_NAME = "coursename";
  112. var COURSE_NUMBEROFTEAMS = "coursenumberofteams";
  113. var COURSE_TOTALSTUDENTS = "coursetotalstudents";
  114. var COURSE_UNREGISTERED = "courseunregistered";
  115. var COURSE_STATUS = "coursestatus";
  116. var EVALUATION_ACTIVATED = "activated";
  117. var EVALUATION_ARCHIVED = "evaluationarchived";
  118. var EVALUATION_COMMENTSENABLED = "commentsstatus";
  119. var EVALUATION_DEADLINE = "deadline";
  120. var EVALUATION_DEADLINETIME = "deadlinetime";
  121. var EVALUATION_GRACEPERIOD = "graceperiod";
  122. var EVALUATION_INSTRUCTIONS = "instr";
  123. var EVALUATION_NAME = "evaluationname";
  124. var EVALUATION_NUMBEROFCOMPLETEDEVALUATIONS = "numberofevaluations";
  125. var EVALUATION_NUMBEROFEVALUATIONS = "numberofcompletedevaluations";
  126. var EVALUATION_PUBLISHED = "published";
  127. var EVALUATION_START = "start";
  128. var EVALUATION_STARTTIME = "starttime";
  129. var EVALUATION_TIMEZONE = "timezone";
  130. var EVALUATION_TYPE = "evaluationtype";
  131. var STUDENT_COMMENTS = "comments";
  132. var STUDENT_COMMENTSEDITED = "commentsedited";
  133. var STUDENT_COMMENTSTOSTUDENT = "commentstostudent";
  134. var STUDENT_COURSEID = "courseid";
  135. var STUDENT_EDITCOMMENTS = "editcomments";
  136. var STUDENT_EDITEMAIL = "editemail";
  137. var STUDENT_EDITGOOGLEID = "editgoogleid";
  138. var STUDENT_EDITNAME = "editname";
  139. var STUDENT_EDITTEAMNAME = "editteamname";
  140. var STUDENT_EMAIL = "email";
  141. var STUDENT_FROMSTUDENT = "fromemail";
  142. var STUDENT_FROMSTUDENTCOMMENTS = "fromstudentcomments";
  143. var STUDENT_FROMSTUDENTNAME = "fromname";
  144. var STUDENT_ID = "id";
  145. var STUDENT_INFORMATION = "information";
  146. var STUDENT_JUSTIFICATION = "justification";
  147. var STUDENT_NAME = "name";
  148. var STUDENT_NAMEEDITED = "nameedited";
  149. var STUDENT_NUMBEROFSUBMISSIONS = "numberofsubmissions";
  150. var STUDENT_POINTS = "points";
  151. var STUDENT_POINTSBUMPRATIO = "pointsbumpratio";
  152. var STUDENT_REGKEY = "regkey";
  153. var STUDENT_STATUS = "status";
  154. var STUDENT_TEAMNAME = "teamname";
  155. var STUDENT_TEAMNAMEEDITED = "teamnameedited";
  156. var STUDENT_TOSTUDENT = "toemail";
  157. var STUDENT_TOSTUDENTCOMMENTS = "tostudentcomments";
  158. var STUDENT_TOSTUDENTNAME = "toname";
  159. /*
  160. * Returns
  161. *
  162. * 0: successful 1: server error 2: field(s) empty 3: courseID invalid 4: name
  163. * invalid 5: course exists
  164. *
  165. */
  166. function addCourse(courseID, courseName)
  167. {
  168. if(xmlhttp)
  169. {
  170. courseID = trim(courseID);
  171. courseName = trim(courseName);
  172. if(courseID == "" || courseName == "")
  173. {
  174. return 2;
  175. }
  176. else if(!isCourseIDValid(courseID))
  177. {
  178. return 3;
  179. }
  180. else if(!isCourseNameValid(courseName))
  181. {
  182. return 4;
  183. }
  184. else
  185. {
  186. xmlhttp.open("POST","teammates",false);
  187. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  188. xmlhttp.send("operation=" + OPERATION_COORDINATOR_ADDCOURSE + "&" + COURSE_ID + "=" + encodeURIComponent(courseID) +
  189. "&" + COURSE_NAME + "=" + encodeURIComponent(courseName));
  190. var results = handleAddCourse();
  191. return results;
  192. }
  193. }
  194. }
  195. /*
  196. * Returns
  197. *
  198. * 0: successful 1: server error 2: fields empty 3: evaluation name invalid 4:
  199. * evaluation schedule invalid 5: evaluation exists 6: course has no teams
  200. *
  201. */
  202. function addEvaluation(courseID, name, instructions, commentsEnabled, start, startTime, deadline, deadlineTime, timeZone, gracePeriod)
  203. {
  204. if(courseID == "" || name == "" || start == "" || startTime == "" || deadline == "" || deadlineTime == "" ||
  205. timeZone == "" || gracePeriod == "" || instructions == "")
  206. {
  207. return 2;
  208. }
  209. else if(!isEvaluationNameValid(name))
  210. {
  211. return 3;
  212. }
  213. else if(!isAddEvaluationScheduleValid(start, startTime, deadline, deadlineTime))
  214. {
  215. return 4;
  216. }
  217. else
  218. {
  219. xmlhttp.open("POST","teammates",false);
  220. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  221. xmlhttp.send("operation=" + OPERATION_COORDINATOR_ADDEVALUATION + "&" + COURSE_ID + "=" + encodeURIComponent(courseID) +
  222. "&" + EVALUATION_NAME + "=" + encodeURIComponent(name) + "&" + EVALUATION_DEADLINE + "=" + encodeURIComponent(deadline) +
  223. "&" + EVALUATION_DEADLINETIME + "=" + encodeURIComponent(deadlineTime) +
  224. "&" + EVALUATION_INSTRUCTIONS + "=" + encodeURIComponent(instructions) + "&" +
  225. EVALUATION_START + "=" + encodeURIComponent(start) + "&" + EVALUATION_STARTTIME + "=" +
  226. encodeURIComponent(startTime) + "&" + EVALUATION_GRACEPERIOD + "=" + encodeURIComponent(gracePeriod) +
  227. "&" + EVALUATION_TIMEZONE + "=" + encodeURIComponent(timeZone) +
  228. "&" + EVALUATION_COMMENTSENABLED + "=" + encodeURIComponent(commentsEnabled));
  229. return handleAddEvaluation();
  230. }
  231. }
  232. /*
  233. * Returns
  234. *
  235. * 0: successful 1: server error
  236. *
  237. */
  238. function archiveCourse(courseID)
  239. {
  240. setStatusMessage(DISPLAY_LOADING);
  241. if(xmlhttp)
  242. {
  243. xmlhttp.open("POST","teammates",false);
  244. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  245. xmlhttp.send("operation=" + OPERATION_COORDINATOR_ARCHIVECOURSE +
  246. "&" + COURSE_ID + "=" + encodeURIComponent(courseID));
  247. return handleArchiveCourse();
  248. }
  249. }
  250. function clearAllDisplay()
  251. {
  252. document.getElementById(DIV_COURSE_INFORMATION).innerHTML = "";
  253. document.getElementById(DIV_COURSE_ENROLLMENT).innerHTML = "";
  254. document.getElementById(DIV_COURSE_ENROLLMENTBUTTONS).innerHTML = "";
  255. document.getElementById(DIV_COURSE_ENROLLMENTRESULTS).innerHTML = "";
  256. document.getElementById(DIV_COURSE_MANAGEMENT).innerHTML = "";
  257. document.getElementById(DIV_COURSE_TABLE).innerHTML = "";
  258. document.getElementById(DIV_EVALUATION_EDITBUTTONS).innerHTML = "";
  259. document.getElementById(DIV_EVALUATION_EDITRESULTSBUTTON).innerHTML = "";
  260. document.getElementById(DIV_EVALUATION_INFORMATION).innerHTML = "";
  261. document.getElementById(DIV_EVALUATION_MANAGEMENT).innerHTML = "";
  262. document.getElementById(DIV_EVALUATION_SUMMARYTABLE).innerHTML = "";
  263. document.getElementById(DIV_EVALUATION_TABLE).innerHTML = "";
  264. document.getElementById(DIV_HEADER_OPERATION).innerHTML = "";
  265. document.getElementById(DIV_STATUS_EDITEVALUATIONRESULTS).innerHTML = "";
  266. document.getElementById(DIV_STUDENT_EDITBUTTONS).innerHTML = "";
  267. document.getElementById(DIV_STUDENT_INFORMATION).innerHTML = "";
  268. document.getElementById(DIV_STUDENT_TABLE).innerHTML = "";
  269. clearStatusMessage();
  270. }
  271. function checkEditStudentInput(editName, editTeamName, editEmail, editGoogleID)
  272. {
  273. if(editName == "" || editTeamName == "" || editEmail == "")
  274. {
  275. setStatusMessage(DISPLAY_EDITSTUDENT_FIELDSEMPTY);
  276. }
  277. if(!isStudentNameValid(editName))
  278. {
  279. setStatusMessage(DISPLAY_STUDENT_NAMEINVALID);
  280. }
  281. else if(!isStudentEmailValid(editEmail))
  282. {
  283. setStatusMessage(DISPLAY_STUDENT_EMAILINVALID);
  284. }
  285. else if(!isStudentTeamNameValid(editTeamName))
  286. {
  287. setStatusMessage(DISPLAY_STUDENT_TEAMNAMEINVALID);
  288. }
  289. }
  290. function checkEnrollmentInput(input)
  291. {
  292. input = replaceAll(input,"|","\t");
  293. var entries = input.split("\n");
  294. var fields;
  295. var entriesLength = entries.length;
  296. for(var x = 0; x < entriesLength; x++)
  297. {
  298. // Ignore blank line
  299. if(entries[x] != ""){
  300. // Separate the fields
  301. fields = entries[x].split("\t");
  302. var fieldsLength = fields.length;
  303. // Make sure that all fields are present
  304. if(fieldsLength < 3)
  305. {
  306. setStatusMessage("<font color=\"#F00\">Line " + (x+1) + ":</font> " + DISPLAY_ENROLLMENT_FIELDSMISSING);
  307. }
  308. else if(fieldsLength > 4)
  309. {
  310. setStatusMessage("<font color=\"#F00\">Line " + (x+1) + ":</font> " + DISPLAY_ENROLLMENT_FIELDSEXTRA);
  311. }
  312. // Check that fields are correct
  313. if(!isStudentNameValid(trim(fields[1])))
  314. {
  315. setStatusMessage("<font color=\"#F00\">Line " + (x+1) + ":</font> " + DISPLAY_STUDENT_NAMEINVALID);
  316. }
  317. else if(!isStudentEmailValid(trim(fields[2])))
  318. {
  319. setStatusMessage("<font color=\"#F00\">Line " + (x+1) + ":</font> " + DISPLAY_STUDENT_EMAILINVALID);
  320. }
  321. else if(!isStudentTeamNameValid(trim(fields[0])))
  322. {
  323. setStatusMessage("<font color=\"#F00\">Line " + (x+1) + ":</font> " + DISPLAY_STUDENT_TEAMNAMEINVALID);
  324. }
  325. }
  326. }
  327. }
  328. function compileSubmissionsIntoSummaryList(submissionList)
  329. {
  330. var summaryList = new Array();
  331. var exists = false;
  332. var toStudent;
  333. var toStudentName;
  334. var toStudentComments;
  335. var totalPoints;
  336. var totalPointGivers;
  337. var claimedPoints;
  338. var teamName;
  339. var average;
  340. var difference;
  341. var submitted;
  342. var pointsBumpRatio;
  343. var count = 0;
  344. for(loop = 0; loop < submissionList.length; loop++)
  345. {
  346. exists = false;
  347. submitted = false;
  348. for(x = 0; x < summaryList.length; x++)
  349. {
  350. if(summaryList[x].toStudent == submissionList[loop].toStudent)
  351. {
  352. exists = true;
  353. }
  354. }
  355. if(exists == false)
  356. {
  357. toStudent = submissionList[loop].toStudent;
  358. toStudentName = submissionList[loop].toStudentName;
  359. toStudentComments = submissionList[loop].toStudentComments;
  360. teamName = submissionList[loop].teamName;
  361. totalPoints = 0;
  362. totalPointGivers = 0;
  363. for(y = loop; y < submissionList.length; y++)
  364. {
  365. if(submissionList[y].toStudent == toStudent)
  366. {
  367. if(submissionList[y].fromStudent == toStudent)
  368. {
  369. if(submissionList[y].points == -999 || submissionList[y].points == -101)
  370. {
  371. claimedPoints = "N/A";
  372. }
  373. else
  374. {
  375. claimedPoints = Math.round(submissionList[y].points * submissionList[y].pointsBumpRatio);
  376. }
  377. if(submissionList[y].points != -999)
  378. {
  379. submitted = true;
  380. }
  381. }
  382. else
  383. {
  384. if(submissionList[y].points != -999 && submissionList[y].points != -101)
  385. {
  386. totalPoints += submissionList[y].points * submissionList[y].pointsBumpRatio;
  387. totalPointGivers++;
  388. }
  389. }
  390. }
  391. }
  392. if(totalPointGivers != 0)
  393. {
  394. average = Math.round(totalPoints / totalPointGivers);
  395. }
  396. else
  397. {
  398. average = "N/A";
  399. }
  400. if(claimedPoints != "N/A" && average != "N/A")
  401. {
  402. difference = Math.round(average-claimedPoints);
  403. }
  404. else
  405. {
  406. difference = "N/A";
  407. }
  408. summaryList[count++] = { toStudent:toStudent, toStudentName:toStudentName, teamName:teamName,
  409. average:average, difference:difference, toStudentComments:toStudentComments, submitted:submitted,
  410. claimedPoints:claimedPoints};
  411. }
  412. }
  413. // Find normalizing points bump ratio for averages
  414. var teamsNormalized = new Array();
  415. count = 0;
  416. for(loop = 0; loop < summaryList.length; loop++)
  417. {
  418. // Reset variables
  419. exists = false;
  420. totalPoints = 0;
  421. totalGivers = 0;
  422. pointsBumpRatio = 0;
  423. // Check if the team is added
  424. for(y = 0; y < teamsNormalized.length; y++)
  425. {
  426. if(summaryList[loop].teamName == teamsNormalized[y].teamName)
  427. {
  428. exists = true;
  429. break;
  430. }
  431. }
  432. if(exists == false)
  433. {
  434. // Tabulate the perceived scores
  435. for(y = loop; y < summaryList.length; y++)
  436. {
  437. if(summaryList[y].teamName == summaryList[loop].teamName && summaryList[y].average != "N/A")
  438. {
  439. totalPoints += summaryList[y].average;
  440. totalGivers += 1;
  441. }
  442. }
  443. if(totalGivers != 0)
  444. {
  445. pointsBumpRatio = totalGivers * 100 / totalPoints;
  446. // Store the bump ratio
  447. teamsNormalized[count++] = {pointsBumpRatio:pointsBumpRatio, teamName:teamName};
  448. }
  449. }
  450. }
  451. // Do the normalization
  452. for(loop = 0; loop < teamsNormalized.length; loop++)
  453. {
  454. for(y = 0; y < summaryList.length; y++)
  455. {
  456. if(summaryList[y].teamName == teamsNormalized[loop].teamName && summaryList[y].average != "N/A")
  457. {
  458. summaryList[y].average = Math.round(summaryList[y].average * teamsNormalized[loop].pointsBumpRatio);
  459. if(summaryList[y].claimedPoints != "N/A")
  460. {
  461. summaryList[y].difference = Math.round(summaryList[y].average-summaryList[y].claimedPoints);
  462. }
  463. else
  464. {
  465. summaryList[y].difference = "N/A";
  466. }
  467. }
  468. }
  469. }
  470. return summaryList;
  471. }
  472. function convertDateFromDDMMYYYYToMMDDYYYY(dateString)
  473. {
  474. var newDateString = dateString.substring(3,5) + "/" + dateString.substring(0,2) + "/" +
  475. dateString.substring(6,10);
  476. return newDateString;
  477. }
  478. function convertDateToDDMMYYYY(date)
  479. {
  480. var string;
  481. if(date.getDate() < 10)
  482. {
  483. string = "0" + date.getDate();
  484. }
  485. else
  486. {
  487. string = date.getDate();
  488. }
  489. string = string + "/";
  490. if(date.getMonth()+1 < 10)
  491. {
  492. string = string + "0" + (date.getMonth()+1);
  493. }
  494. else
  495. {
  496. string = string + (date.getMonth()+1);
  497. }
  498. string = string + "/" + date.getFullYear();
  499. return string;
  500. }
  501. function convertDateToHHMM(date)
  502. {
  503. var string;
  504. if(date.getHours() < 10)
  505. {
  506. string = "0" + date.getHours();
  507. }
  508. else
  509. {
  510. string = "" + date.getHours();
  511. }
  512. if(date.getMinutes() < 10)
  513. {
  514. string = string + "0" + date.getMinutes();
  515. }
  516. else
  517. {
  518. string = string + date.getMinutes();
  519. }
  520. return string;
  521. }
  522. /*
  523. * Returns
  524. *
  525. * 0: successful 1: server error
  526. */
  527. function deleteAllStudents(courseID)
  528. {
  529. if(xmlhttp)
  530. {
  531. xmlhttp.open("POST","teammates",false);
  532. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  533. xmlhttp.send("operation=" + OPERATION_COORDINATOR_DELETEALLSTUDENTS + "&" + COURSE_ID + "=" + encodeURIComponent(courseID));
  534. return handleDeleteAllStudents(courseID);
  535. }
  536. }
  537. /*
  538. * Returns
  539. *
  540. * 0: successful 1: server error
  541. *
  542. */
  543. function deleteCourse(courseID)
  544. {
  545. if(xmlhttp)
  546. {
  547. xmlhttp.open("POST","teammates",false);
  548. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  549. xmlhttp.send("operation=" + OPERATION_COORDINATOR_DELETECOURSE + "&" + COURSE_ID + "=" + encodeURIComponent(courseID));
  550. return handleDeleteCourse();
  551. }
  552. }
  553. /*
  554. * Returns
  555. *
  556. * 0: successful 1: server error
  557. *
  558. */
  559. function deleteEvaluation(courseID, name)
  560. {
  561. if(xmlhttp)
  562. {
  563. xmlhttp.open("POST","teammates",false);
  564. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  565. xmlhttp.send("operation=" + OPERATION_COORDINATOR_DELETEEVALUATION + "&" + COURSE_ID + "="
  566. + encodeURIComponent(courseID) + "&" + EVALUATION_NAME + "=" + encodeURIComponent(name));
  567. return handleDeleteEvaluation();
  568. }
  569. }
  570. /*
  571. * Returns
  572. *
  573. * 0: successful 1: server error
  574. */
  575. function deleteStudent(courseID, studentEmail)
  576. {
  577. if(xmlhttp)
  578. {
  579. xmlhttp.open("POST","teammates",false);
  580. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  581. xmlhttp.send("operation=" + OPERATION_COORDINATOR_DELETESTUDENT + "&" + COURSE_ID + "=" +
  582. encodeURIComponent(courseID) + "&" + STUDENT_EMAIL + "=" + encodeURIComponent(studentEmail));
  583. return handleDeleteStudent();
  584. }
  585. }
  586. function displayCourseInformation(courseID)
  587. {
  588. clearAllDisplay();
  589. doGetCourse(courseID);
  590. // doGetStudentList(courseID);
  591. document.getElementById(DIV_TOPOFPAGE).scrollIntoView(true);
  592. }
  593. function displayCoursesTab()
  594. {
  595. clearAllDisplay();
  596. setStatusMessage(DISPLAY_LOADING);
  597. printAddCourse();
  598. doGetCourseList();
  599. document.getElementById(DIV_TOPOFPAGE).scrollIntoView(true);
  600. }
  601. function displayEditEvaluation(evaluationList, loop)
  602. {
  603. var courseID = evaluationList[loop].courseID;
  604. var name = evaluationList[loop].name;
  605. var instructions = evaluationList[loop].instructions;
  606. var start = evaluationList[loop].start;
  607. var deadline = evaluationList[loop].deadline;
  608. var timeZone = evaluationList[loop].timeZone;
  609. var gracePeriod = evaluationList[loop].gracePeriod;
  610. var status = evaluationList[loop].status;
  611. var activated = evaluationList[loop].activated;
  612. var commentsEnabled = evaluationList[loop].commentsEnabled;
  613. clearAllDisplay();
  614. printEditEvaluation(courseID, name, instructions, commentsEnabled, start, deadline, timeZone, gracePeriod, status, activated);
  615. document.getElementById(DIV_TOPOFPAGE).scrollIntoView(true);
  616. }
  617. function displayEditStudent(courseID, email, name, teamName, googleID, registrationKey, comments)
  618. {
  619. clearAllDisplay();
  620. document.getElementById(DIV_TOPOFPAGE).scrollIntoView(true);
  621. printEditStudent(courseID, email, name, teamName, googleID, registrationKey, comments);
  622. }
  623. function displayEnrollmentPage(courseID)
  624. {
  625. clearAllDisplay();
  626. printEnrollmentPage(courseID);
  627. document.getElementById(DIV_TOPOFPAGE).scrollIntoView(true);
  628. }
  629. function displayEnrollmentResultsPage(reports)
  630. {
  631. clearAllDisplay();
  632. printEnrollmentResultsPage(reports);
  633. document.getElementById(DIV_TOPOFPAGE).scrollIntoView(true);
  634. }
  635. function displayEvaluationResults(evaluationList, loop)
  636. {
  637. var courseID = evaluationList[loop].courseID;
  638. var name = evaluationList[loop].name;
  639. var instructions = evaluationList[loop].instructions;
  640. var start = evaluationList[loop].start;
  641. var deadline = evaluationList[loop].deadline;
  642. var gracePeriod = evaluationList[loop].gracePeriod;
  643. var status = evaluationList[loop].status;
  644. var activated = evaluationList[loop].activated;
  645. var commentsEnabled = evaluationList[loop].commentsEnabled;
  646. // xl: new added
  647. var published = evaluationList[loop].published;
  648. clearAllDisplay();
  649. printEvaluationHeaderForm(courseID, name, start, deadline, status, activated, published);
  650. evaluationResultsViewStatus = evaluationResultsView.reviewer;
  651. doGetSubmissionResultsList(courseID, name, status, commentsEnabled);
  652. document.getElementById(DIV_TOPOFPAGE).scrollIntoView(true);
  653. }
  654. function displayEvaluationsTab()
  655. {
  656. clearAllDisplay();
  657. printEvaluationAddForm();
  658. doGetCourseIDList();
  659. doGetEvaluationList();
  660. document.getElementById(DIV_TOPOFPAGE).scrollIntoView(true);
  661. }
  662. function displayStudentInformation(courseID, email, name, teamName, googleID, registrationKey, comments)
  663. {
  664. clearAllDisplay();
  665. document.getElementById(DIV_TOPOFPAGE).scrollIntoView(true);
  666. printStudent(courseID, email, name, teamName, googleID, registrationKey, comments);
  667. }
  668. function doAddCourse(courseID, name)
  669. {
  670. setStatusMessage(DISPLAY_LOADING);
  671. var results = addCourse(courseID, name);
  672. if(results == 0)
  673. {
  674. printAddCourse();
  675. doGetCourseList();
  676. setStatusMessage(DISPLAY_COURSE_ADDED);
  677. }
  678. else if(results == 1)
  679. {
  680. alert(DISPLAY_SERVERERROR);
  681. }
  682. else if(results == 2)
  683. {
  684. setStatusMessage(DISPLAY_FIELDS_EMPTY);
  685. }
  686. else if(results == 3)
  687. {
  688. setStatusMessage(DISPLAY_COURSE_INVALIDID);
  689. }
  690. else if(results == 4)
  691. {
  692. setStatusMessage(DISPLAY_COURSE_INVALIDNAME);
  693. }
  694. else if(results == 5)
  695. {
  696. setStatusMessage(DISPLAY_COURSE_EXISTS);
  697. }
  698. }
  699. function doAddEvaluation(courseID, name, instructions, commentsEnabled, start, startTime, deadline, deadlineTime, timeZone, gracePeriod)
  700. {
  701. setStatusMessage(DISPLAY_LOADING);
  702. var results = addEvaluation(courseID, name, instructions, commentsEnabled, start, startTime, deadline,
  703. deadlineTime, timeZone, gracePeriod);
  704. clearStatusMessage();
  705. if(results == 0)
  706. {
  707. displayEvaluationsTab();
  708. setStatusMessage(DISPLAY_EVALUATION_ADDED);
  709. }
  710. else if(results == 1)
  711. {
  712. alert(DISPLAY_SERVERERROR);
  713. }
  714. else if(results == 2)
  715. {
  716. setStatusMessage(DISPLAY_FIELDS_EMPTY);
  717. }
  718. else if(results == 3)
  719. {
  720. setStatusMessage(DISPLAY_EVALUATION_NAMEINVALID);
  721. }
  722. else if(results == 4)
  723. {
  724. setStatusMessage(DISPLAY_EVALUATION_SCHEDULEINVALID);
  725. }
  726. else if(results == 5)
  727. {
  728. setStatusMessage(DISPLAY_EVALUATION_EXISTS);
  729. }
  730. else if(results == 6)
  731. {
  732. setStatusMessage(DISPLAY_COURSE_NOTEAMS);
  733. }
  734. }
  735. function doArchiveCourse(courseID)
  736. {
  737. setStatusMessage(DISPLAY_LOADING);
  738. var results = archiveCourse(courseID);
  739. if(results == 0)
  740. {
  741. doGetCourseList();
  742. setStatusMessage(DISPLAY_COURSE_ARCHIVED);
  743. }
  744. else
  745. {
  746. alert(DISPLAY_SERVERERROR);
  747. }
  748. }
  749. function doDeleteCourse(courseID)
  750. {
  751. setStatusMessage(DISPLAY_LOADING);
  752. var results = deleteCourse(courseID);
  753. if(results != 1)
  754. {
  755. doGetCourseList();
  756. setStatusMessage(DISPLAY_COURSE_DELETED);
  757. }
  758. else
  759. {
  760. alert(DISPLAY_SERVERERROR);
  761. }
  762. }
  763. function doDeleteEvaluation(courseID, name)
  764. {
  765. setStatusMessage(DISPLAY_LOADING);
  766. var results = deleteEvaluation(courseID, name);
  767. if(results == 0)
  768. {
  769. doGetEvaluationList();
  770. setStatusMessage(DISPLAY_EVALUATION_DELETED);
  771. }
  772. else
  773. {
  774. alert(DISPLAY_SERVERERROR);
  775. }
  776. }
  777. function doDeleteAllStudents(courseID)
  778. {
  779. setStatusMessage(DISPLAY_LOADING);
  780. var results = deleteAllStudents(courseID);
  781. if(results != 1)
  782. {
  783. doGetStudentList(courseID);
  784. doGetCourse(courseID);
  785. setStatusMessage(DISPLAY_COURSE_DELETEDALLSTUDENTS);
  786. }
  787. else
  788. {
  789. alert(DISPLAY_SERVERERROR);
  790. }
  791. }
  792. function doDeleteStudent(courseID, email)
  793. {
  794. setStatusMessage(DISPLAY_LOADING);
  795. var results = deleteStudent(courseID, email);
  796. if(results != 1)
  797. {
  798. displayCourseInformation(courseID);
  799. }
  800. else
  801. {
  802. alert(DISPLAY_SERVERERROR);
  803. }
  804. }
  805. function doEditEvaluation(courseID, name, editStart, editStartTime, editDeadline, editDeadlineTime, timeZone,
  806. editGracePeriod, editInstructions, editCommentsEnabled, activated, status)
  807. {
  808. setStatusMessage(DISPLAY_LOADING);
  809. var results = editEvaluation(courseID, name, editStart, editStartTime, editDeadline, editDeadlineTime,
  810. timeZone, editGracePeriod, editInstructions, editCommentsEnabled, activated, status)
  811. if(results == 0)
  812. {
  813. if(activated == true)
  814. {
  815. displayEvaluationsTab();
  816. toggleInformStudentsOfEvaluationChanges(courseID, name);
  817. }
  818. else
  819. {
  820. displayEvaluationsTab();
  821. setStatusMessage(DISPLAY_EVALUATION_EDITED);
  822. }
  823. }
  824. else if(results == 2)
  825. {
  826. setStatusMessage(DISPLAY_FIELDS_EMPTY);
  827. }
  828. else if(results == 3)
  829. {
  830. setStatusMessage(DISPLAY_EVALUATION_SCHEDULEINVALID);
  831. }
  832. else if(results == 4)
  833. {
  834. displayEvaluationsTab();
  835. setStatusMessage(DISPLAY_EVALUATION_EDITED);
  836. }
  837. else
  838. {
  839. alert(DISPLAY_SERVERERROR);
  840. }
  841. }
  842. function doEditEvaluationResultsByReviewer(form, summaryList, position, commentsEnabled, status)
  843. {
  844. toggleEditEvaluationResultsStatusMessage(DISPLAY_LOADING);
  845. var submissionList = extractSubmissionList(form);
  846. var results = editEvaluationResults(submissionList, commentsEnabled);
  847. if(results == 0)
  848. {
  849. // submissionList get from extractSubmissionList(form) is not complete
  850. submissionList = getSubmissionList(submissionList[0].courseID, submissionList[0].evaluationName);
  851. if(submissionList != 1){
  852. printEvaluationIndividualForm(submissionList, summaryList, position, commentsEnabled, status, REVIEWER);
  853. document.getElementById(DIV_EVALUATION_EDITRESULTSBUTTON).innerHTML = "";
  854. toggleEditEvaluationResultsStatusMessage("");
  855. setStatusMessage(DISPLAY_EVALUATION_RESULTSEDITED);
  856. }
  857. else{
  858. alert(DISPLAY_SERVERERROR);
  859. }
  860. }
  861. else if(results == 2)
  862. {
  863. toggleEditEvaluationResultsStatusMessage(DISPLAY_FIELDS_EMPTY);
  864. }
  865. else
  866. {
  867. alert(DISPLAY_SERVERERROR);
  868. }
  869. }
  870. function doEditStudent(courseID, email, editName, editTeamName, editEmail, editGoogleID, editComments)
  871. {
  872. setStatusMessage(DISPLAY_LOADING);
  873. var results = editStudent(courseID, email, editName, editTeamName, editEmail, editGoogleID, editComments);
  874. if(results == 0)
  875. {
  876. displayCourseInformation(courseID);
  877. setStatusMessage(DISPLAY_STUDENT_EDITED);
  878. }
  879. else if(results == 2)
  880. {
  881. displayCourseInformation(courseID);
  882. setStatusMessage("Duplicated Email found. Cannot edit student information");
  883. }
  884. else
  885. {
  886. alert(DISPLAY_SERVERERROR);
  887. }
  888. }
  889. function doEnrolStudents(input, courseID)
  890. {
  891. setStatusMessage(DISPLAY_LOADING);
  892. var results = enrolStudents(input, courseID);
  893. clearStatusMessage();
  894. if(results == 1)
  895. {
  896. alert(DISPLAY_SERVERERROR);
  897. }
  898. else if(results == 2)
  899. {
  900. }
  901. else if(results == 3)
  902. {
  903. checkEnrollmentInput(input)
  904. }
  905. else
  906. {
  907. displayEnrollmentResultsPage(results);
  908. }
  909. }
  910. function doGetCourse(courseID) {
  911. setStatusMessage(DISPLAY_LOADING);
  912. var courseInfo = getCourse(courseID);
  913. var studentInfo = getStudentList(courseID);
  914. clearStatusMessage();
  915. if (courseInfo != 1) {
  916. printCourseCoordinatorForm(courseInfo);
  917. } else {
  918. alert(DISPLAY_SERVERERROR);
  919. }
  920. if (studentInfo != 1) {
  921. // toggleSortStudentsByName calls printStudentList too
  922. if (studentSortStatus == studentSort.name) {
  923. toggleSortStudentsByName(studentInfo, courseID);
  924. } else if(studentSortStatus == studentSort.status) {
  925. toggleSortStudentsByStatus(studentInfo, courseID);
  926. } else {
  927. toggleSortStudentsByTeamName(studentInfo, courseID);
  928. }
  929. } else {
  930. alert(DISPLAY_SERVERERROR);
  931. }
  932. }
  933. function doGetCourseIDList()
  934. {
  935. setStatusMessage(DISPLAY_LOADING);
  936. var results = getCourseList();
  937. if(results != 1)
  938. {
  939. populateCourseIDOptions(results);
  940. }
  941. else
  942. {
  943. alert(DISPLAY_SERVERERROR);
  944. }
  945. }
  946. function doGetCourseList()
  947. {
  948. setStatusMessage(DISPLAY_LOADING);
  949. var results = getCourseList();
  950. clearStatusMessage();
  951. if(results != 1)
  952. {
  953. // toggleSortCoursesByID calls printCourseList too
  954. printCourseList(results, COORDINATOR);
  955. if(courseSortStatus == courseSort.name)
  956. {
  957. toggleSortCoursesByName(results);
  958. }
  959. else
  960. {
  961. toggleSortCoursesByID(results);
  962. }
  963. }
  964. else
  965. {
  966. alert(DISPLAY_SERVERERROR);
  967. }
  968. }
  969. function doGetEvaluationList()
  970. {
  971. setStatusMessage(DISPLAY_LOADING);
  972. var results = getEvaluationList();
  973. clearStatusMessage();
  974. if(results != 1)
  975. {
  976. // Toggle calls printEvaluationList too
  977. if(evaluationSortStatus == evaluationSort.name)
  978. {
  979. toggleSortEvaluationsByName(results);
  980. }
  981. else
  982. {
  983. toggleSortEvaluationsByCourseID(results);
  984. }
  985. }
  986. else
  987. {
  988. alert(DISPLAY_SERVERERROR);
  989. }
  990. }
  991. //function doGetStudentList(courseID) {
  992. // setStatusMessage(DISPLAY_LOADING);
  993. //
  994. // var results = getStudentList(courseID);
  995. //
  996. // clearStatusMessage();
  997. //
  998. // if (results != 1) {
  999. // // toggleSortStudentsByName calls printStudentList too
  1000. // if (studentSortStatus == studentSort.name) {
  1001. // toggleSortStudentsByName(results, courseID);
  1002. // } else if(studentSortStatus == studentSort.status) {
  1003. // toggleSortStudentsByStatus(results, courseID);
  1004. // } else {
  1005. // toggleSortStudentsByTeamName(results, courseID);
  1006. // }
  1007. // } else {
  1008. // alert(DISPLAY_SERVERERROR);
  1009. // }
  1010. //}
  1011. function doGetSubmissionResultsList(courseID, evaluationName, status, commentsEnabled)
  1012. {
  1013. setStatusMessage(DISPLAY_LOADING);
  1014. var results = getSubmissionList(courseID, evaluationName);
  1015. clearStatusMessage();
  1016. if(results != 1)
  1017. {
  1018. var compiledResults = compileSubmissionsIntoSummaryList(results);
  1019. toggleSortEvaluationSummaryListByTeamName(results, compiledResults, status, commentsEnabled);
  1020. }
  1021. else
  1022. {
  1023. alert(DISPLAY_SERVERERROR);
  1024. }
  1025. }
  1026. function doInformStudentsOfEvaluationChanges(courseID, name)
  1027. {
  1028. setStatusMessage(DISPLAY_LOADING);
  1029. var results = informStudentsOfEvaluationChanges(courseID, name);
  1030. clearStatusMessage();
  1031. if(results != 1)
  1032. {
  1033. setStatusMessage(DISPLAY_EVALUATION_INFORMEDSTUDENTSOFCHANGES);
  1034. }
  1035. else
  1036. {
  1037. alert(DISPLAY_SERVERERROR);
  1038. }
  1039. }
  1040. function doPublishEvaluation(courseID, name, reload)
  1041. {
  1042. setStatusMessage(DISPLAY_LOADING);
  1043. var results = publishEvaluation(courseID, name);
  1044. clearStatusMessage();
  1045. if(results != 1)
  1046. {
  1047. if(reload){
  1048. doGetEvaluationList();
  1049. }
  1050. else{
  1051. document.getElementById('button_publish').value = "Unpublish";
  1052. document.getElementById('button_publish').onclick = function() {
  1053. togglePublishEvaluation(courseID, name, false, false);
  1054. };
  1055. }
  1056. setStatusMessage(DISPLAY_EVALUATION_PUBLISHED);
  1057. }
  1058. else
  1059. {
  1060. alert(DISPLAY_SERVERERROR);
  1061. }
  1062. }
  1063. function doUnpublishEvaluation(courseID, name, reload)
  1064. {
  1065. setStatusMessage(DISPLAY_LOADING);
  1066. var results = unpublishEvaluation(courseID, name);
  1067. clearStatusMessage();
  1068. if(results != 1)
  1069. {
  1070. if(reload){
  1071. doGetEvaluationList();
  1072. }
  1073. else{
  1074. document.getElementById('button_publish').value = "Publish";
  1075. document.getElementById('button_publish').onclick = function() {
  1076. togglePublishEvaluation(courseID, name, true, false);
  1077. };
  1078. }
  1079. setStatusMessage(DISPLAY_EVALUATION_UNPUBLISHED);
  1080. }
  1081. else
  1082. {
  1083. alert(DISPLAY_SERVERERROR);
  1084. }
  1085. }
  1086. function doRemindStudents(courseID, evaluationName)
  1087. {
  1088. setStatusMessage(DISPLAY_LOADING);
  1089. var results = remindStudents(courseID, evaluationName);
  1090. clearStatusMessage();
  1091. if(results != 1)
  1092. {
  1093. setStatusMessage(DISPLAY_EVALUATION_REMINDERSSENT);
  1094. }
  1095. else
  1096. {
  1097. alert(DISPLAY_SERVERERROR);
  1098. }
  1099. }
  1100. function doSendRegistrationKey(courseID, email, name) {
  1101. setStatusMessage(DISPLAY_LOADING);
  1102. document.getElementById(DIV_TOPOFPAGE).scrollIntoView(true);
  1103. var results = sendRegistrationKey(courseID, email);
  1104. clearStatusMessage();
  1105. if (results != 1) {
  1106. setStatusMessage(DISPLAY_COURSE_SENTREGISTRATIONKEY + name + ".");
  1107. } else {
  1108. alert(DISPLAY_SERVERERROR);
  1109. }
  1110. }
  1111. function doSendRegistrationKeys(courseID) {
  1112. setStatusMessage(DISPLAY_LOADING);
  1113. var results = sendRegistrationKeys(courseID);
  1114. clearStatusMessage();
  1115. if (results != 1) {
  1116. setStatusMessage(DISPLAY_COURSE_SENTREGISTRATIONKEYS);
  1117. } else {
  1118. alert(DISPLAY_SERVERERROR);
  1119. }
  1120. }
  1121. function doUnarchiveCourse(courseID)
  1122. {
  1123. setStatusMessage(DISPLAY_LOADING);
  1124. var results = unarchiveCourse(courseID);
  1125. if(results == 0)
  1126. {
  1127. doGetCourseList();
  1128. setStatusMessage(DISPLAY_COURSE_UNARCHIVED);
  1129. }
  1130. else
  1131. {
  1132. alert(DISPLAY_SERVERERROR);
  1133. }
  1134. }
  1135. /*
  1136. * Returns
  1137. *
  1138. * 0: successful 1: server error 2: fields empty 3: schedule invalid 4: no
  1139. * changes made
  1140. */
  1141. function editEvaluation(courseID, name, editStart, editStartTime, editDeadline, editDeadlineTime, timeZone, editGracePeriod,
  1142. editInstructions, editCommentsEnabled, activated, status)
  1143. {
  1144. setStatusMessage(DISPLAY_LOADING);
  1145. if(courseID == "" || name == "" || editStart == "" || editStartTime == "" || editDeadline == "" ||
  1146. editDeadlineTime == "" || editGracePeriod == "" || editInstructions == "" || editCommentsEnabled == "")
  1147. {
  1148. return 2;
  1149. }
  1150. else if(!isEditEvaluationScheduleValid(editStart, editStartTime, editDeadline, editDeadlineTime, timeZone, activated, status))
  1151. {
  1152. return 3;
  1153. }
  1154. else
  1155. {
  1156. xmlhttp.open("POST","teammates",false);
  1157. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  1158. xmlhttp.send("operation=" + OPERATION_COORDINATOR_EDITEVALUATION + "&" + COURSE_ID + "=" + encodeURIComponent(courseID) +
  1159. "&" + EVALUATION_NAME + "=" + encodeURIComponent(name) + "&" + EVALUATION_DEADLINE + "=" + encodeURIComponent(editDeadline) +
  1160. "&" + EVALUATION_DEADLINETIME + "=" + encodeURIComponent(editDeadlineTime) +
  1161. "&" + EVALUATION_INSTRUCTIONS + "=" + encodeURIComponent(editInstructions) + "&" +
  1162. EVALUATION_START + "=" + encodeURIComponent(editStart) + "&" + EVALUATION_STARTTIME + "=" +
  1163. encodeURIComponent(editStartTime) + "&" + EVALUATION_GRACEPERIOD + "=" + encodeURIComponent(editGracePeriod) +
  1164. "&" + EVALUATION_COMMENTSENABLED + "=" + editCommentsEnabled);
  1165. return handleEditEvaluation();
  1166. }
  1167. }
  1168. /*
  1169. * Returns
  1170. *
  1171. * 0: successful 1: server error 2: deadline passed 3: fields missing
  1172. *
  1173. */
  1174. function editEvaluationResults(submissionList, commentsEnabled)
  1175. {
  1176. var submissionListLength = submissionList.length;
  1177. for(loop = 0; loop < submissionListLength; loop++)
  1178. {
  1179. if(submissionList[loop].commentsToStudent == "" && commentsEnabled == true)
  1180. {
  1181. return 2;
  1182. }
  1183. if(submissionList[loop].justification == "")
  1184. {
  1185. return 2;
  1186. }
  1187. if( submissionList[loop].points == -999)
  1188. {
  1189. return 2;
  1190. }
  1191. if(!commentsEnabled)
  1192. {
  1193. submissionList[loop].commentsToStudent = "";
  1194. }
  1195. }
  1196. var request = "operation=" + OPERATION_COORDINATOR_EDITEVALUATIONRESULTS + "&" + STUDENT_NUMBEROFSUBMISSIONS +
  1197. "=" + submissionList.length + "&" + COURSE_ID + "=" + submissionList[0].courseID +
  1198. "&" + EVALUATION_NAME + "=" + submissionList[0].evaluationName +
  1199. "&" + STUDENT_TEAMNAME + "=" + submissionList[0].teamName;
  1200. for(loop = 0; loop < submissionListLength; loop++)
  1201. {
  1202. request = request + "&" + STUDENT_FROMSTUDENT + loop + "=" +
  1203. encodeURIComponent(submissionList[loop].fromStudent) + "&" +
  1204. STUDENT_TOSTUDENT + loop + "=" +
  1205. encodeURIComponent(submissionList[loop].toStudent) + "&" +
  1206. STUDENT_POINTS + loop + "=" +
  1207. encodeURIComponent(submissionList[loop].points) + "&" +
  1208. STUDENT_JUSTIFICATION + loop + "=" +
  1209. encodeURIComponent(submissionList[loop].justification) + "&" +
  1210. STUDENT_COMMENTSTOSTUDENT + loop + "=" +
  1211. encodeURIComponent(submissionList[loop].commentsToStudent);
  1212. }
  1213. if(xmlhttp)
  1214. {
  1215. xmlhttp.open("POST","teammates",false);
  1216. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  1217. xmlhttp.send(request);
  1218. return handleEditEvaluationResults();
  1219. }
  1220. }
  1221. /*
  1222. * Returns
  1223. *
  1224. * 0: successful 1: server error 2: unable to change teams
  1225. *
  1226. */
  1227. function editStudent(courseID, email, editName, editTeamName, editEmail, editGoogleID, editComments)
  1228. {
  1229. editName = trim(editName);
  1230. editTeamName = trim(editTeamName);
  1231. editEmail = trim(editEmail);
  1232. editGoogleID = trim(editGoogleID);
  1233. if(isEditStudentInputValid(editName, editTeamName, editEmail, editGoogleID))
  1234. {
  1235. if(xmlhttp)
  1236. {
  1237. xmlhttp.open("POST","teammates",false);
  1238. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  1239. xmlhttp.send("operation=" + OPERATION_COORDINATOR_EDITSTUDENT + "&" + COURSE_ID + "=" +
  1240. encodeURIComponent(courseID) + "&" + STUDENT_EMAIL + "=" + encodeURIComponent(email) +
  1241. "&" + STUDENT_EDITNAME + "=" + encodeURIComponent(editName) + "&" + STUDENT_EDITTEAMNAME + "=" + encodeURIComponent(editTeamName) +
  1242. "&" + STUDENT_EDITEMAIL + "=" + encodeURIComponent(editEmail) + "&" + STUDENT_EDITGOOGLEID + "=" + encodeURIComponent(editGoogleID) +
  1243. "&" + STUDENT_EDITCOMMENTS + "=" + encodeURIComponent(editComments));
  1244. return handleEditStudent();
  1245. }
  1246. }
  1247. }
  1248. /*
  1249. * Returns
  1250. *
  1251. * reports: successful 1: server error 2: input empty 3: input invalid
  1252. *
  1253. */
  1254. function enrolStudents(input, courseID)
  1255. {
  1256. input = replaceAll(input,"|","\t");
  1257. if(xmlhttp)
  1258. {
  1259. // Remove trailing "\n"
  1260. if(input.lastIndexOf("\n") == input.length-1)
  1261. {
  1262. input = input.substring(0, input.length-1);
  1263. }
  1264. if(input == "")
  1265. {
  1266. return 2;
  1267. }
  1268. else if(isEnrollmentInputValid(input))
  1269. {
  1270. xmlhttp.open("POST","teammates",false);
  1271. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  1272. xmlhttp.send("operation=" + OPERATION_COORDINATOR_ENROLSTUDENTS + "&" + STUDENT_INFORMATION
  1273. + "=" + encodeURIComponent(input) + "&" + COURSE_ID + "=" + encodeURIComponent(courseID));
  1274. return handleEnrolStudents();
  1275. }
  1276. else
  1277. {
  1278. return 3;
  1279. }
  1280. }
  1281. }
  1282. function extractSubmissionList(form)
  1283. {
  1284. var submissionList = [];
  1285. var counter = 0;
  1286. var fromStudent;
  1287. var toStudent;
  1288. var courseID;
  1289. var evaluationName;
  1290. var teamName;
  1291. var points;
  1292. var justification;
  1293. var commentsToStudent;
  1294. var formLength = form.length;
  1295. for(loop = 0; loop < formLength; loop++)
  1296. {
  1297. fromStudent = form.elements[loop++].value;
  1298. toStudent = form.elements[loop++].value;
  1299. teamName = form.elements[loop++].value;
  1300. courseID = form.elements[loop++].value;
  1301. evaluationName = form.elements[loop++].value;
  1302. points = form.elements[loop++].value;
  1303. justification = form.elements[loop++].value;
  1304. commentsToStudent = form.elements[loop].value;
  1305. submissionList[counter++] = {fromStudent:fromStudent, toStudent:toStudent, courseID:courseID,
  1306. evaluationName:evaluationName, teamName:teamName, points:points,
  1307. justification:justification, commentsToStudent:commentsToStudent};
  1308. }
  1309. return submissionList;
  1310. }
  1311. /*
  1312. * Returns
  1313. *
  1314. * courseInfo: successful 1: server error
  1315. *
  1316. */
  1317. function getCourse(courseID)
  1318. {
  1319. if(xmlhttp)
  1320. {
  1321. xmlhttp.open("POST","teammates",false);
  1322. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  1323. xmlhttp.send("operation=" + OPERATION_COORDINATOR_GETCOURSE + "&" + COURSE_ID + "=" + encodeURIComponent(courseID));
  1324. return handleGetCourse();
  1325. }
  1326. }
  1327. /*
  1328. * Returns
  1329. *
  1330. * courseList: successful 1: server error
  1331. *
  1332. */
  1333. function getCourseList()
  1334. {
  1335. if(xmlhttp)
  1336. {
  1337. xmlhttp.open("POST","teammates",false);
  1338. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  1339. xmlhttp.send("operation=" + OPERATION_COORDINATOR_GETCOURSELIST);
  1340. return handleGetCourseList();
  1341. }
  1342. }
  1343. function getDateWithTimeZoneOffset(timeZone)
  1344. {
  1345. var now = new Date();
  1346. // Convert local time zone to ms
  1347. var nowTime = now.getTime();
  1348. // Obtain local time zone offset
  1349. var localOffset = now.getTimezoneOffset() * 60000;
  1350. // Obtain UTC time
  1351. var UTC = nowTime + localOffset;
  1352. // Add the time zone of evaluation
  1353. var nowMilliS = UTC + (timeZone * 60 * 60 * 1000);
  1354. now.setTime(nowMilliS);
  1355. return now;
  1356. }
  1357. /*
  1358. * Returns
  1359. *
  1360. * evaluationList: successful 1: server error
  1361. *
  1362. */
  1363. function getEvaluationList()
  1364. {
  1365. if(xmlhttp)
  1366. {
  1367. OPERATION_CURRENT = OPERATION_COORDINATOR_GETEVALUATIONLIST;
  1368. xmlhttp.open("POST","teammates",false);
  1369. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  1370. xmlhttp.send("operation=" + OPERATION_COORDINATOR_GETEVALUATIONLIST);
  1371. return handleGetEvaluationList();
  1372. }
  1373. }
  1374. // return the value of the radio button that is checked
  1375. // return an empty string if none are checked, or
  1376. // there are no radio buttons
  1377. function getCheckedValue(radioObj) {
  1378. if(!radioObj)
  1379. return "";
  1380. var radioLength = radioObj.length;
  1381. if(radioLength == undefined)
  1382. if(radioObj.checked)
  1383. return radioObj.value;
  1384. else
  1385. return "";
  1386. for(var i = 0; i < radioLength; i++) {
  1387. if(radioObj[i].checked) {
  1388. return radioObj[i].value;
  1389. }
  1390. }
  1391. return "";
  1392. }
  1393. /*
  1394. * Returns
  1395. *
  1396. * studentList: successful 1: server error
  1397. *
  1398. */
  1399. function getStudentList(courseID)
  1400. {
  1401. if(xmlhttp)
  1402. {
  1403. xmlhttp.open("POST","teammates",false);
  1404. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  1405. xmlhttp.send("operation=" + OPERATION_COORDINATOR_GETSTUDENTLIST + "&" + COURSE_ID + "=" + encodeURIComponent(courseID));
  1406. return handleGetStudentList();
  1407. }
  1408. }
  1409. /*
  1410. * Returns
  1411. *
  1412. * submissionList: successful 1: server error
  1413. *
  1414. */
  1415. function getSubmissionList(courseID, evaluationName)
  1416. {
  1417. if(xmlhttp)
  1418. {
  1419. xmlhttp.open("POST","teammates",false);
  1420. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  1421. xmlhttp.send("operation=" + OPERATION_COORDINATOR_GETSUBMISSIONLIST + "&" + COURSE_ID + "=" +
  1422. encodeURIComponent(courseID) + "&" + EVALUATION_NAME + "=" + encodeURIComponent(evaluationName));
  1423. return handleGetSubmissionList();
  1424. }
  1425. }
  1426. function getXMLObject()
  1427. {
  1428. var xmlHttp = false;
  1429. try {
  1430. xmlHttp = new ActiveXObject("Msxml2.XMLHTTP")
  1431. }
  1432. catch (e) {
  1433. try {
  1434. xmlHttp = new ActiveXObject("Microsoft.XMLHTTP")
  1435. }
  1436. catch (e2) {
  1437. xmlHttp = false
  1438. }
  1439. }
  1440. if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
  1441. xmlHttp = new XMLHttpRequest();
  1442. }
  1443. return xmlHttp;
  1444. }
  1445. /*
  1446. * Returns
  1447. *
  1448. * 0: successful 1: server error 5: course exists
  1449. *
  1450. */
  1451. function handleAddCourse()
  1452. {
  1453. if (xmlhttp.status == 200)
  1454. {
  1455. var status = xmlhttp.responseXML.getElementsByTagName("status")[0];
  1456. var message;
  1457. if(status != null)
  1458. {
  1459. var message = status.firstChild.nodeValue;
  1460. if(message == MSG_COURSE_EXISTS)
  1461. {
  1462. return 5;
  1463. }
  1464. else
  1465. {
  1466. return 0;
  1467. }
  1468. }
  1469. }
  1470. else
  1471. {
  1472. return 1;
  1473. }
  1474. }
  1475. /*
  1476. * Returns
  1477. *
  1478. * 0: successful 1: server error 5: evaluation exists 6: course has no teams
  1479. *
  1480. */
  1481. function handleAddEvaluation()
  1482. {
  1483. if (xmlhttp.status == 200)
  1484. {
  1485. var status = xmlhttp.responseXML.getElementsByTagName("status")[0];
  1486. var message;
  1487. if(status != null)
  1488. {
  1489. var message = status.firstChild.nodeValue;
  1490. if(message == MSG_EVALUATION_EXISTS)
  1491. {
  1492. return 5;
  1493. }
  1494. else if(message == MSG_COURSE_NOTEAMS)
  1495. {
  1496. return 6;
  1497. }
  1498. else
  1499. {
  1500. return 0;
  1501. }
  1502. }
  1503. }
  1504. else
  1505. {
  1506. return 1;
  1507. }
  1508. }
  1509. /*
  1510. * Returns
  1511. *
  1512. * 0: successful 1: server error
  1513. *
  1514. */
  1515. function handleArchiveCourse()
  1516. {
  1517. if(xmlhttp)
  1518. {
  1519. return 0;
  1520. }
  1521. else
  1522. {
  1523. return 1;
  1524. }
  1525. }
  1526. /*
  1527. * Returns
  1528. *
  1529. * 0: successful 1: server error
  1530. *
  1531. */
  1532. function handleDeleteAllStudents(courseID)
  1533. {
  1534. if(xmlhttp)
  1535. {
  1536. return 0;
  1537. }
  1538. else
  1539. {
  1540. return 1;
  1541. }
  1542. }
  1543. /*
  1544. * Returns
  1545. *
  1546. * 0: successful 1: server error
  1547. *
  1548. */
  1549. function handleDeleteCourse()
  1550. {
  1551. if(xmlhttp)
  1552. {
  1553. return 0;
  1554. }
  1555. else
  1556. {
  1557. return 1;
  1558. }
  1559. }
  1560. /*
  1561. * Returns
  1562. *
  1563. * 0: successful 1: server error
  1564. *
  1565. */
  1566. function handleDeleteEvaluation()
  1567. {
  1568. if(xmlhttp)
  1569. {
  1570. return 0;
  1571. }
  1572. else
  1573. {
  1574. return 1;
  1575. }
  1576. }
  1577. /*
  1578. * Returns
  1579. *
  1580. * 0: successful 1: server error
  1581. *
  1582. */
  1583. function handleDeleteStudent()
  1584. {
  1585. if(xmlhttp.status == 200)
  1586. {
  1587. return 0;
  1588. }
  1589. else
  1590. {
  1591. return 1;
  1592. }
  1593. }
  1594. /*
  1595. * Returns
  1596. *
  1597. * 0: successful 1: server error 4: no changes made
  1598. *
  1599. */
  1600. function handleEditEvaluation()
  1601. {
  1602. if(xmlhttp.status == 200)
  1603. {
  1604. var status = xmlhttp.responseXML.getElementsByTagName("status")[0];
  1605. if(status != null)
  1606. {
  1607. var message = status.firstChild.nodeValue;
  1608. if(message == MSG_EVALUATION_EDITED)
  1609. {
  1610. return 0;
  1611. }
  1612. else
  1613. {
  1614. return 4;
  1615. }
  1616. }
  1617. }
  1618. else
  1619. {
  1620. return 1;
  1621. }
  1622. }
  1623. /*
  1624. * Returns
  1625. *
  1626. * 0: successful 1: server error
  1627. *
  1628. */
  1629. function handleEditEvaluationResults()
  1630. {
  1631. if(xmlhttp.status == 200)
  1632. {
  1633. return 0;
  1634. }
  1635. else
  1636. {
  1637. return 1;
  1638. }
  1639. }
  1640. /*
  1641. * Returns
  1642. *
  1643. * 0: successful 1: server error 2: unable to change teams
  1644. *
  1645. */
  1646. function handleEditStudent()
  1647. {
  1648. if (xmlhttp.status == 200)
  1649. {
  1650. var status = xmlhttp.responseXML.getElementsByTagName("status")[0];
  1651. if(status != null)
  1652. {
  1653. var message = status.firstChild.nodeValue;
  1654. if(message == MSG_EVALUATION_UNABLETOCHANGETEAMS)
  1655. {
  1656. return 2;
  1657. }
  1658. else
  1659. {
  1660. return 0;
  1661. }
  1662. }
  1663. }
  1664. else
  1665. {
  1666. return 1;
  1667. }
  1668. }
  1669. /*
  1670. * Returns
  1671. *
  1672. * reports: successful 1: server error
  1673. *
  1674. */
  1675. function handleEnrolStudents()
  1676. {
  1677. if (xmlhttp.status == 200)
  1678. {
  1679. var enrollmentReports = xmlhttp.responseXML.getElementsByTagName("enrollmentreports")[0];
  1680. if(enrollmentReports != null)
  1681. {
  1682. var enrollmentReport;
  1683. var studentName;
  1684. var studentEmail;
  1685. var status;
  1686. var nameEdited;
  1687. var teamNameEdited;
  1688. var commentsEdited;
  1689. var reports = [];
  1690. var len = enrollmentReports.childNodes.length;
  1691. for(loop = 0; loop < len; loop++)
  1692. {
  1693. enrollmentReport = enrollmentReports.childNodes[loop];
  1694. studentName = enrollmentReport.getElementsByTagName(STUDENT_NAME)[0].firstChild.nodeValue;
  1695. studentEmail = enrollmentReport.getElementsByTagName(STUDENT_EMAIL)[0].firstChild.nodeValue;
  1696. status = enrollmentReport.getElementsByTagName(STUDENT_STATUS)[0].firstChild.nodeValue;
  1697. nameEdited = enrollmentReport.getElementsByTagName(STUDENT_NAMEEDITED)[0].firstChild.nodeValue;
  1698. teamNameEdited = enrollmentReport.getElementsByTagName(STUDENT_TEAMNAMEEDITED)[0].firstChild.nodeValue;
  1699. commentsEdited = enrollmentReport.getElementsByTagName(STUDENT_COMMENT

Large files files are truncated, but you can click here to view the full file