PageRenderTime 58ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/code/war/js/coordinator.js

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

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