PageRenderTime 66ms CodeModel.GetById 21ms RepoModel.GetById 0ms 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
  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(STUDENT_COMMENTSEDITED)[0].firstChild.nodeValue;
  1679. enrollmentReport = {studentName:studentName, studentEmail:studentEmail,
  1680. nameEdited:nameEdited, teamNameEdited:teamNameEdited, commentsEdited:commentsEdited, status:status};
  1681. reports.push(enrollmentReport);
  1682. }
  1683. }
  1684. return reports;
  1685. }
  1686. else
  1687. {
  1688. return 1;
  1689. }
  1690. }
  1691. /*
  1692. * Returns
  1693. *
  1694. * 0: successful 1: server error
  1695. *
  1696. */
  1697. function handleInformStudentsOfEvaluationChanges()
  1698. {
  1699. if (xmlhttp.status == 200)
  1700. {
  1701. return 0;
  1702. }
  1703. else
  1704. {
  1705. return 1;
  1706. }
  1707. }
  1708. /*
  1709. * Returns
  1710. *
  1711. * courseInfo: successful 1: server error
  1712. *
  1713. */
  1714. function handleGetCourse()
  1715. {
  1716. if (xmlhttp.status == 200)
  1717. {
  1718. var courses = xmlhttp.responseXML.getElementsByTagName("courses")[0];
  1719. var courseInfo;
  1720. if(courses != null)
  1721. {
  1722. var course;
  1723. var ID;
  1724. var name;
  1725. var numberofteams;
  1726. var status;
  1727. course = courses.childNodes[0];
  1728. ID = course.getElementsByTagName(COURSE_ID)[0].firstChild.nodeValue;
  1729. name = course.getElementsByTagName(COURSE_NAME)[0].firstChild.nodeValue;
  1730. numberOfTeams = course.getElementsByTagName(COURSE_NUMBEROFTEAMS)[0].firstChild.nodeValue;
  1731. status = course.getElementsByTagName(COURSE_STATUS)[0].firstChild.nodeValue;
  1732. courseInfo = {ID:ID, name:name, numberOfTeams:numberOfTeams, status:status};
  1733. return courseInfo;
  1734. }
  1735. }
  1736. else
  1737. {
  1738. return 1;
  1739. }
  1740. }
  1741. /*
  1742. * Returns
  1743. *
  1744. * courseIDList: successful 1: server error
  1745. *
  1746. */
  1747. function handleGetCourseIDList()
  1748. {
  1749. if (xmlhttp.status == 200)
  1750. {
  1751. clearStatusMessage();
  1752. var courses = xmlhttp.responseXML.getElementsByTagName("courses")[0];
  1753. var course;
  1754. var courseID;
  1755. var courseIDList = new Array();
  1756. for(loop = 0; loop < courses.childNodes.length; loop++)
  1757. {
  1758. course = courses.childNodes[loop];
  1759. courseID = course.getElementsByTagName(COURSE_ID)[0].firstChild.nodeValue;
  1760. courseIDList[loop] = {courseID:courseID};
  1761. }
  1762. return courseIDList;
  1763. }
  1764. else
  1765. {
  1766. return 1;
  1767. }
  1768. }
  1769. /*
  1770. * Returns
  1771. *
  1772. * courseList: successful 1: server error
  1773. *
  1774. */
  1775. function handleGetCourseList()
  1776. {
  1777. if (xmlhttp.status == 200)
  1778. {
  1779. var courses = xmlhttp.responseXML.getElementsByTagName("courses")[0];
  1780. var courseList = new Array();
  1781. if(courses != null)
  1782. {
  1783. var course;
  1784. var ID;
  1785. var name;
  1786. var numberOfTeams;
  1787. var totalStudnets;
  1788. var unregistered;
  1789. var status;
  1790. for(loop = 0; loop < courses.childNodes.length; loop++)
  1791. {
  1792. course = courses.childNodes[loop];
  1793. ID = course.getElementsByTagName(COURSE_ID)[0].firstChild.nodeValue;
  1794. name = course.getElementsByTagName(COURSE_NAME)[0].firstChild.nodeValue;
  1795. numberOfTeams = course.getElementsByTagName(COURSE_NUMBEROFTEAMS)[0].firstChild.nodeValue;
  1796. totalStudents = course.getElementsByTagName(COURSE_TOTALSTUDENTS)[0].firstChild.nodeValue;
  1797. unregistered = course.getElementsByTagName(COURSE_UNREGISTERED)[0].firstChild.nodeValue;
  1798. status = course.getElementsByTagName(COURSE_STATUS)[0].firstChild.nodeValue;
  1799. courseList[loop] = {ID:ID, name:name, numberOfTeams:numberOfTeams, totalStudents:totalStudents, unregistered:unregistered, status:status};
  1800. }
  1801. }
  1802. return courseList;
  1803. }
  1804. else
  1805. {
  1806. return 1;
  1807. }
  1808. }
  1809. /*
  1810. * Returns
  1811. *
  1812. * evaluationList: successful 1: server error
  1813. *
  1814. */
  1815. function handleGetEvaluationList()
  1816. {
  1817. if (xmlhttp.status == 200)
  1818. {
  1819. var evaluations = xmlhttp.responseXML.getElementsByTagName("evaluations")[0];
  1820. var evaluationList = new Array();
  1821. var now;
  1822. var nowMilliS;
  1823. var nowTime;
  1824. var localOffset;
  1825. var UTC;
  1826. var evaluation;
  1827. var courseID;
  1828. var name;
  1829. var commentsEnabled;
  1830. var instructions;
  1831. var start;
  1832. var deadline;
  1833. var gracePeriod;
  1834. var numberOfCompletedEvaluations;
  1835. var numberOfEvaluations;
  1836. var published;
  1837. var status;
  1838. var activated;
  1839. if(evaluations != null)
  1840. {
  1841. for(loop = 0; loop < evaluations.childNodes.length; loop++)
  1842. {
  1843. evaluation = evaluations.childNodes[loop];
  1844. courseID = evaluation.getElementsByTagName(COURSE_ID)[0].firstChild.nodeValue;
  1845. name = evaluation.getElementsByTagName(EVALUATION_NAME)[0].firstChild.nodeValue;
  1846. commentsEnabled = (evaluation.getElementsByTagName(EVALUATION_COMMENTSENABLED)[0].firstChild.nodeValue.toLowerCase() == "true");
  1847. instructions = evaluation.getElementsByTagName(EVALUATION_INSTRUCTIONS)[0].firstChild.nodeValue;
  1848. start = new Date(evaluation.getElementsByTagName(EVALUATION_START)[0].firstChild.nodeValue);
  1849. deadline = new Date(evaluation.getElementsByTagName(EVALUATION_DEADLINE)[0].firstChild.nodeValue);
  1850. timeZone = parseFloat(evaluation.getElementsByTagName(EVALUATION_TIMEZONE)[0].firstChild.nodeValue);
  1851. gracePeriod = parseInt(evaluation.getElementsByTagName(EVALUATION_GRACEPERIOD)[0].firstChild.nodeValue);
  1852. published = (evaluation.getElementsByTagName(EVALUATION_PUBLISHED)[0].firstChild.nodeValue.toLowerCase() == "true");
  1853. activated = (evaluation.getElementsByTagName(EVALUATION_ACTIVATED)[0].firstChild.nodeValue.toLowerCase() == "true");
  1854. numberOfCompletedEvaluations = parseInt(evaluation.getElementsByTagName(EVALUATION_NUMBEROFCOMPLETEDEVALUATIONS)[0].firstChild.nodeValue);
  1855. numberOfEvaluations = parseInt(evaluation.getElementsByTagName(EVALUATION_NUMBEROFEVALUATIONS)[0].firstChild.nodeValue);
  1856. now = getDateWithTimeZoneOffset(timeZone);
  1857. // Check if evaluation should be open or closed
  1858. if(now > start && deadline > now)
  1859. {
  1860. status = "OPEN";
  1861. }
  1862. else if(now > deadline || activated)
  1863. {
  1864. status = "CLOSED";
  1865. }
  1866. else if (now < start && !activated)
  1867. {
  1868. status = "AWAITING";
  1869. }
  1870. if(published == true)
  1871. {
  1872. status = "PUBLISHED";
  1873. }
  1874. evaluationList[loop] = { courseID:courseID, name:name, commentsEnabled:commentsEnabled, instructions:instructions,
  1875. start:start, deadline:deadline, timeZone:timeZone, gracePeriod:gracePeriod, published:published,
  1876. published:published, activated:activated, numberOfCompletedEvaluations:numberOfCompletedEvaluations,
  1877. numberOfEvaluations:numberOfEvaluations, status:status};
  1878. }
  1879. }
  1880. return evaluationList;
  1881. }
  1882. else
  1883. {
  1884. 1;
  1885. }
  1886. }
  1887. /*
  1888. * Returns
  1889. *
  1890. * studentList: successful 1: server error
  1891. *
  1892. */
  1893. function handleGetStudentList()
  1894. {
  1895. if (xmlhttp.status == 200)
  1896. {
  1897. var students = xmlhttp.responseXML.getElementsByTagName("students")[0];
  1898. var studentList = new Array();
  1899. var student;
  1900. var name;
  1901. var teamName;
  1902. var email;
  1903. var registrationKey;
  1904. var comments;
  1905. var courseID;
  1906. var googleID;
  1907. for(var loop = 0; loop < students.childNodes.length; loop++)
  1908. {
  1909. student = students.childNodes[loop];
  1910. name = student.getElementsByTagName(STUDENT_NAME)[0].firstChild.nodeValue;
  1911. teamName = student.getElementsByTagName(STUDENT_TEAMNAME)[0].firstChild.nodeValue;
  1912. email = student.getElementsByTagName(STUDENT_EMAIL)[0].firstChild.nodeValue;
  1913. registrationKey = student.getElementsByTagName(STUDENT_REGKEY)[0].firstChild.nodeValue;
  1914. googleID = student.getElementsByTagName(STUDENT_ID)[0].firstChild.nodeValue;
  1915. comments = student.getElementsByTagName(STUDENT_COMMENTS)[0].firstChild.nodeValue;
  1916. courseID = student.getElementsByTagName(STUDENT_COURSEID)[0].firstChild.nodeValue;
  1917. studentList[loop] = {name:name, teamName:teamName, email:email, registrationKey:registrationKey, googleID:googleID,
  1918. comments:comments, courseID:courseID};
  1919. }
  1920. return studentList;
  1921. }
  1922. else
  1923. {
  1924. return 1;
  1925. }
  1926. }
  1927. /*
  1928. * Returns
  1929. *
  1930. * submissionList: successful 1: server error
  1931. *
  1932. */
  1933. function handleGetSubmissionList()
  1934. {
  1935. if(xmlhttp.status == 200)
  1936. {
  1937. var submissions = xmlhttp.responseXML.getElementsByTagName("submissions")[0];
  1938. var submissionList = new Array();
  1939. var submission;
  1940. var fromStudentName;
  1941. var toStudentName;
  1942. var fromStudent;
  1943. var toStudent;
  1944. var fromStudentComments;
  1945. var toStudentComments;
  1946. var courseID;
  1947. var evaluationName;
  1948. var teamName;
  1949. var points;
  1950. var pointsBumpRatio;
  1951. var justification;
  1952. var commentsToStudent;
  1953. if(submissions != null)
  1954. {
  1955. for(loop = 0; loop < submissions.childNodes.length; loop++)
  1956. {
  1957. submission = submissions.childNodes[loop];
  1958. courseID = submission.getElementsByTagName(COURSE_ID)[0].firstChild.nodeValue;
  1959. evaluationName = submission.getElementsByTagName(EVALUATION_NAME)[0].firstChild.nodeValue;
  1960. teamName = submission.getElementsByTagName(STUDENT_TEAMNAME)[0].firstChild.nodeValue;
  1961. fromStudentName = submission.getElementsByTagName(STUDENT_FROMSTUDENTNAME)[0].firstChild.nodeValue;
  1962. fromStudent = submission.getElementsByTagName(STUDENT_FROMSTUDENT)[0].firstChild.nodeValue;
  1963. fromStudentComments = submission.getElementsByTagName(STUDENT_FROMSTUDENTCOMMENTS)[0].firstChild.nodeValue;
  1964. toStudentName = submission.getElementsByTagName(STUDENT_TOSTUDENTNAME)[0].firstChild.nodeValue;
  1965. toStudent = submission.getElementsByTagName(STUDENT_TOSTUDENT)[0].firstChild.nodeValue;
  1966. toStudentComments = submission.getElementsByTagName(STUDENT_TOSTUDENTCOMMENTS)[0].firstChild.nodeValue;
  1967. points = parseInt(submission.getElementsByTagName(STUDENT_POINTS)[0].firstChild.nodeValue);
  1968. pointsBumpRatio = parseFloat(submission.getElementsByTagName(STUDENT_POINTSBUMPRATIO)[0].firstChild.nodeValue);
  1969. justification = submission.getElementsByTagName(STUDENT_JUSTIFICATION)[0].firstChild.nodeValue;
  1970. commentsToStudent = submission.getElementsByTagName(STUDENT_COMMENTSTOSTUDENT)[0].firstChild.nodeValue;
  1971. submissionList[loop] = {fromStudentName:fromStudentName, toStudentName:toStudentName,
  1972. fromStudent:fromStudent, toStudent:toStudent, courseID:courseID,
  1973. evaluationName:evaluationName, teamName:teamName, justification:justification,
  1974. commentsToStudent:commentsToStudent, points:points, pointsBumpRatio:pointsBumpRatio,
  1975. fromStudentComments:fromStudentComments, toStudentComments:toStudentComments};
  1976. }
  1977. }
  1978. return submissionList;
  1979. }
  1980. else
  1981. {
  1982. return 1;
  1983. }
  1984. }
  1985. function handleLogout()
  1986. {
  1987. if (xmlhttp.status == 200)
  1988. {
  1989. var url = xmlhttp.responseXML.getElementsByTagName("url")[0];
  1990. window.location = url.firstChild.nodeValue;
  1991. }
  1992. }
  1993. /*
  1994. * Returns
  1995. *
  1996. * 0: successful 1: server error
  1997. *
  1998. */
  1999. function handlePublishEvaluation()
  2000. {
  2001. if (xmlhttp.status == 200)
  2002. {
  2003. return 0;
  2004. }
  2005. else
  2006. {
  2007. return 1;
  2008. }
  2009. }
  2010. /*
  2011. * Returns
  2012. *
  2013. * 0: successful 1: server error
  2014. *
  2015. */
  2016. function handleUnpublishEvaluation()
  2017. {
  2018. if (xmlhttp.status == 200)
  2019. {
  2020. return 0;
  2021. }
  2022. else
  2023. {
  2024. return 1;
  2025. }
  2026. }
  2027. function handleRemindStudents()
  2028. {
  2029. if (xmlhttp.status == 200)
  2030. {
  2031. return 0;
  2032. }
  2033. else
  2034. {
  2035. return 1;
  2036. }
  2037. }
  2038. /*
  2039. * Returns
  2040. *
  2041. * 0: successful 1: server error
  2042. *
  2043. */
  2044. function handleSendRegistrationKey()
  2045. {
  2046. if (xmlhttp.status == 200)
  2047. {
  2048. return 0;
  2049. }
  2050. else
  2051. {
  2052. return 1;
  2053. }
  2054. }
  2055. /*
  2056. * Returns
  2057. *
  2058. * 0: successful 1: server error
  2059. */
  2060. function handleSendRegistrationKeys()
  2061. {
  2062. if(xmlhttp.status == 200)
  2063. {
  2064. return 0;
  2065. }
  2066. else
  2067. {
  2068. return 1;
  2069. }
  2070. }
  2071. /*
  2072. * Returns
  2073. *
  2074. * 0: successful 1: server error
  2075. *
  2076. */
  2077. function handleUnarchiveCourse()
  2078. {
  2079. if(xmlhttp)
  2080. {
  2081. return 0;
  2082. }
  2083. else
  2084. {
  2085. return 1;
  2086. }
  2087. }
  2088. function informStudentsOfEvaluationChanges(courseID, name)
  2089. {
  2090. if(xmlhttp)
  2091. {
  2092. xmlhttp.open("POST","teammates",false);
  2093. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  2094. xmlhttp.send("operation=" + OPERATION_COORDINATOR_INFORMSTUDENTSOFEVALUATIONCHANGES
  2095. + "&" + COURSE_ID + "=" + encodeURIComponent(courseID) + "&" + EVALUATION_NAME + "="
  2096. + encodeURIComponent(name));
  2097. }
  2098. return handleInformStudentsOfEvaluationChanges();
  2099. }
  2100. function isAddEvaluationScheduleValid(start, startTime, deadline, deadlineTime)
  2101. {
  2102. var start = convertDateFromDDMMYYYYToMMDDYYYY(start);
  2103. var deadline = convertDateFromDDMMYYYYToMMDDYYYY(deadline);
  2104. var now = new Date();
  2105. start = new Date(start);
  2106. deadline = new Date(deadline);
  2107. if(startTime != "24")
  2108. {
  2109. start.setHours(parseInt(startTime));
  2110. }
  2111. else
  2112. {
  2113. start.setHours(23);
  2114. start.setMinutes(59);
  2115. }
  2116. if(deadlineTime != "24")
  2117. {
  2118. deadline.setHours(parseInt(deadlineTime));
  2119. }
  2120. else
  2121. {
  2122. deadline.setHours(23);
  2123. deadline.setMinutes(59);
  2124. }
  2125. if(start > deadline)
  2126. {
  2127. return false;
  2128. }
  2129. else if(now > start)
  2130. {
  2131. return false;
  2132. }
  2133. else if(!(start > deadline || deadline > start))
  2134. {
  2135. if(parseInt(startTime) >= parseInt(deadlineTime))
  2136. {
  2137. return false;
  2138. }
  2139. }
  2140. return true;
  2141. }
  2142. function isCourseIDValid(courseID)
  2143. {
  2144. if(courseID.indexOf("\\") >= 0 || courseID.indexOf("'") >= 0 || courseID.indexOf("\"") >= 0)
  2145. {
  2146. return false;
  2147. }
  2148. if(courseID.match(/^[a-zA-Z0-9.-]*$/) == null)
  2149. {
  2150. return false;
  2151. }
  2152. if(courseID.length > 21)
  2153. {
  2154. return false;
  2155. }
  2156. return true;
  2157. }
  2158. function isCourseNameValid(courseName)
  2159. {
  2160. if(courseName.length > 38)
  2161. {
  2162. return false;
  2163. }
  2164. return true;
  2165. }
  2166. function isEditEvaluationScheduleValid(start, startTime, deadline, deadlineTime, timeZone, activated, status)
  2167. {
  2168. var startString = convertDateFromDDMMYYYYToMMDDYYYY(start);
  2169. var deadlineString = convertDateFromDDMMYYYYToMMDDYYYY(deadline);
  2170. var now = getDateWithTimeZoneOffset(timeZone);
  2171. start = new Date(startString);
  2172. deadline = new Date(deadlineString);
  2173. if(startTime != "24")
  2174. {
  2175. start.setHours(parseInt(startTime));
  2176. }
  2177. else
  2178. {
  2179. start.setHours(23);
  2180. start.setMinutes(59);
  2181. }
  2182. if(deadlineTime != "24")
  2183. {
  2184. deadline.setHours(parseInt(deadlineTime));
  2185. }
  2186. else
  2187. {
  2188. deadline.setHours(23);
  2189. deadline.setMinutes(59);
  2190. }
  2191. if(start > deadline)
  2192. {
  2193. return false;
  2194. }
  2195. else if(status == "AWAITING"){
  2196. // Open evaluation should be done by system only.
  2197. // Thus, coordinator cannot change evaluation ststus from AWAITING to
  2198. // OPEN
  2199. if(start < now){
  2200. return false;
  2201. }
  2202. }
  2203. // else if(now > deadline)
  2204. // {
  2205. // return false;
  2206. // }
  2207. //
  2208. // else if(!(start > deadline || deadline > start))
  2209. // {
  2210. // if(parseInt(startTime) >= parseInt(deadlineTime))
  2211. // {
  2212. // return false;
  2213. // }
  2214. // }
  2215. //
  2216. // else if(!activated && start < now)
  2217. // {
  2218. // return false;
  2219. // }
  2220. //
  2221. return true;
  2222. }
  2223. function isEditStudentInputValid(editName, editTeamName, editEmail, editGoogleID)
  2224. {
  2225. if(editName == "" || editTeamName == "" || editEmail == "")
  2226. {
  2227. return false;
  2228. }
  2229. if(!isStudentNameValid(editName))
  2230. {
  2231. return false;
  2232. }
  2233. else if(!isStudentEmailValid(editEmail))
  2234. {
  2235. return false;
  2236. }
  2237. else if(!isStudentTeamNameValid(editTeamName))
  2238. {
  2239. return false;
  2240. }
  2241. return true;
  2242. }
  2243. function isEnrollmentInputValid(input)
  2244. {
  2245. var entries = input.split("\n");
  2246. var fields;
  2247. for(var x = 0; x < entries.length; x++)
  2248. {
  2249. if(entries[x] != ""){
  2250. // Separate the fields
  2251. fields = entries[x].split("\t");
  2252. // Make sure that all fields are present
  2253. if(fields.length < 3)
  2254. {
  2255. return false;
  2256. }
  2257. else if(fields.length > 4)
  2258. {
  2259. return false;
  2260. }
  2261. // Check that fields are correct
  2262. if(!isStudentNameValid(trim(fields[1])))
  2263. {
  2264. return false;
  2265. }
  2266. else if(!isStudentEmailValid(trim(fields[2])))
  2267. {
  2268. return false;
  2269. }
  2270. else if(!isStudentTeamNameValid(trim(fields[0])))
  2271. {
  2272. return false;
  2273. }
  2274. }
  2275. }
  2276. return true;
  2277. }
  2278. function isEvaluationNameValid(name)
  2279. {
  2280. if(name.indexOf("\\") >= 0 || name.indexOf("'") >= 0 || name.indexOf("\"") >= 0)
  2281. {
  2282. return false;
  2283. }
  2284. if(name.match(/^[a-zA-Z0-9 ]*$/) == null)
  2285. {
  2286. return false;
  2287. }
  2288. if(name.length > 22)
  2289. {
  2290. return false;
  2291. }
  2292. return true;
  2293. }
  2294. function isStudentEmailValid(email)
  2295. {
  2296. if(email.match(/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i) != null && email.length <= 40)
  2297. {
  2298. return true;
  2299. }
  2300. return false;
  2301. }
  2302. function isStudentNameValid(name)
  2303. {
  2304. if(name.indexOf("\\") >= 0 || name.indexOf("'") >= 0 || name.indexOf("\"") >= 0)
  2305. {
  2306. return false;
  2307. }
  2308. else if(name.match(/^.[^\t]*$/) == null)
  2309. {
  2310. return false;
  2311. }
  2312. else if(name.length > 40)
  2313. {
  2314. return false;
  2315. }
  2316. return true;
  2317. }
  2318. function isStudentTeamNameValid(teamName)
  2319. {
  2320. if(teamName.length > 24)
  2321. {
  2322. return false;
  2323. }
  2324. return true;
  2325. }
  2326. function logout()
  2327. {
  2328. if(xmlhttp)
  2329. {
  2330. xmlhttp.open("POST","teammates",false);
  2331. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  2332. xmlhttp.send("operation=" + OPERATION_COORDINATOR_LOGOUT);
  2333. }
  2334. handleLogout();
  2335. }
  2336. function populateCourseIDOptions(courseList)
  2337. {
  2338. var option = document.createElement("OPTION");
  2339. for(x = 0; x < courseList.length; x++)
  2340. {
  2341. option = document.createElement("OPTION");
  2342. option.text = courseList[x].ID;
  2343. option.value = courseList[x].ID;
  2344. document.form_addevaluation.courseid.options.add(option);
  2345. }
  2346. }
  2347. function populateEditEvaluationResultsPointsForm(form, submissionList)
  2348. {
  2349. var points;
  2350. var len = form.elements.length / 8;
  2351. for (x = 0; x < len; x++)
  2352. {
  2353. for (y = 0; y < submissionList.length; y++)
  2354. {
  2355. if(submissionList[y].fromStudent == form.elements[x*8].value &&
  2356. submissionList[y].toStudent == form.elements[x*8+1].value)
  2357. {
  2358. points = submissionList[y].points;
  2359. break;
  2360. }
  2361. }
  2362. setSelectedOption(form.elements[x*8+5], points)
  2363. }
  2364. }
  2365. // xl: new added
  2366. function printEvaluationReportByAction(submissionList, summaryList, status, commentsEnabled){
  2367. // clean page:
  2368. document.getElementById(DIV_EVALUATION_EDITRESULTSBUTTON).innerHTML = "";
  2369. clearStatusMessage();
  2370. // case 1: [x]reviewee [x]summary..............case handler............
  2371. if(document.getElementById('radio_reviewee').checked && document.getElementById('radio_summary').checked){
  2372. evaluationResultsViewStatus = evaluationResultsView.reviewee;
  2373. printEvaluationSummaryForm(submissionList, summaryList.sort(sortByTeamName), status, commentsEnabled, REVIEWEE);
  2374. }
  2375. // case 2: [x]reviewer [x]summary
  2376. else if(document.getElementById('radio_reviewer').checked && document.getElementById('radio_summary').checked){
  2377. evaluationResultsViewStatus = evaluationResultsView.reviewer;
  2378. printEvaluationSummaryForm(submissionList, summaryList.sort(sortByTeamName), status, commentsEnabled, REVIEWER);
  2379. }
  2380. // case 3: [x]reviewee [x]detail
  2381. else if(document.getElementById('radio_reviewee').checked && document.getElementById('radio_detail').checked){
  2382. evaluationResultsViewStatus = evaluationResultsView.reviewee;
  2383. printEvaluationDetailForm(submissionList, summaryList, status, commentsEnabled, REVIEWEE);
  2384. }
  2385. // case 4: [x]reviewer [x]detail
  2386. else if(document.getElementById('radio_reviewer').checked && document.getElementById('radio_detail').checked){
  2387. evaluationResultsViewStatus = evaluationResultsView.reviewer;
  2388. printEvaluationDetailForm(submissionList, summaryList, status, commentsEnabled, REVIEWER);
  2389. }
  2390. // else:
  2391. else{
  2392. // do nothing
  2393. }
  2394. }
  2395. /*
  2396. * Returns
  2397. *
  2398. * 0: successful 1: server error
  2399. *
  2400. */
  2401. function publishEvaluation(courseID, name)
  2402. {
  2403. if(xmlhttp)
  2404. {
  2405. xmlhttp.open("POST","teammates",false);
  2406. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  2407. xmlhttp.send("operation=" + OPERATION_COORDINATOR_PUBLISHEVALUATION + "&" + COURSE_ID + "=" +
  2408. encodeURIComponent(courseID) + "&" + EVALUATION_NAME + "=" + encodeURIComponent(name));
  2409. return handlePublishEvaluation();
  2410. }
  2411. }
  2412. /*
  2413. * Returns
  2414. *
  2415. * 0: successful 1: server error
  2416. *
  2417. */
  2418. function unpublishEvaluation(courseID, name)
  2419. {
  2420. if(xmlhttp)
  2421. {
  2422. xmlhttp.open("POST","teammates",false);
  2423. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  2424. xmlhttp.send("operation=" + OPERATION_COORDINATOR_UNPUBLISHEVALUATION + "&" + COURSE_ID + "=" +
  2425. encodeURIComponent(courseID) + "&" + EVALUATION_NAME + "=" + encodeURIComponent(name));
  2426. return handleUnpublishEvaluation();
  2427. }
  2428. }
  2429. /*
  2430. * Returns
  2431. *
  2432. * 0: successful 1: server error
  2433. *
  2434. */
  2435. function remindStudents(courseID, evaluationName)
  2436. {
  2437. if(xmlhttp)
  2438. {
  2439. xmlhttp.open("POST","teammates",false);
  2440. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  2441. xmlhttp.send("operation=" + OPERATION_COORDINATOR_REMINDSTUDENTS + "&" +
  2442. COURSE_ID + "=" + encodeURIComponent(courseID) + "&" + EVALUATION_NAME + "=" +
  2443. encodeURIComponent(evaluationName));
  2444. handleRemindStudents();
  2445. }
  2446. }
  2447. /*
  2448. * Returns
  2449. *
  2450. * 0: successful 1: server error
  2451. *
  2452. */
  2453. function sendRegistrationKey(courseID, email)
  2454. {
  2455. if(xmlhttp)
  2456. {
  2457. xmlhttp.open("POST","teammates",false);
  2458. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  2459. xmlhttp.send("operation=" + OPERATION_COORDINATOR_SENDREGISTRATIONKEY + "&" + COURSE_ID + "=" +
  2460. encodeURIComponent(courseID) + "&" + STUDENT_EMAIL + "=" + encodeURIComponent(email));
  2461. return handleSendRegistrationKey();
  2462. }
  2463. }
  2464. /*
  2465. * Returns
  2466. *
  2467. * 0: successful 1: server error
  2468. *
  2469. */
  2470. function sendRegistrationKeys(courseID)
  2471. {
  2472. if(xmlhttp)
  2473. {
  2474. xmlhttp.open("POST","teammates",false);
  2475. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  2476. xmlhttp.send("operation=" + OPERATION_COORDINATOR_SENDREGISTRATIONKEYS + "&" + COURSE_ID + "=" +
  2477. encodeURIComponent(courseID));
  2478. return handleSendRegistrationKeys();
  2479. }
  2480. }
  2481. // set the radio button with the given value as being checked
  2482. // do nothing if there are no radio buttons
  2483. // if the given value does not exist, all the radio buttons
  2484. // are reset to unchecked
  2485. function setCheckedValue(radioObj, newValue) {
  2486. if(!radioObj)
  2487. return;
  2488. var radioLength = radioObj.length;
  2489. if(radioLength == undefined) {
  2490. radioObj.checked = (radioObj.value == newValue.toString());
  2491. return;
  2492. }
  2493. for(var i = 0; i < radioLength; i++) {
  2494. radioObj[i].checked = false;
  2495. if(radioObj[i].value == newValue.toString()) {
  2496. radioObj[i].checked = true;
  2497. }
  2498. }
  2499. }
  2500. function setSelectedOption(s, v)
  2501. {
  2502. for (var i = 0; i < s.options.length; i++)
  2503. {
  2504. if(s.options[i].value == v)
  2505. {
  2506. s.options[i].selected = true;
  2507. return;
  2508. }
  2509. }
  2510. }
  2511. function sortByAverage(a, b)
  2512. {
  2513. var x = a.average;
  2514. var y = b.average;
  2515. if(x == "N/A")
  2516. {
  2517. x = 1000;
  2518. }
  2519. if(y == "N/A")
  2520. {
  2521. y = 1000;
  2522. }
  2523. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  2524. }
  2525. function sortByCourseID(a, b)
  2526. {
  2527. var x = a.courseID.toLowerCase();
  2528. var y = b.courseID.toLowerCase();
  2529. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  2530. }
  2531. function sortByDiff(a, b)
  2532. {
  2533. var x = a.difference;
  2534. var y = b.difference;
  2535. if(x == "N/A")
  2536. {
  2537. x = 1000;
  2538. }
  2539. if(y == "N/A")
  2540. {
  2541. y = 1000;
  2542. }
  2543. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  2544. }
  2545. function sortByFromStudentName(a, b)
  2546. {
  2547. var x = a.fromStudentName;
  2548. var y = b.fromStudentName;
  2549. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  2550. }
  2551. function sortByID(a, b)
  2552. {
  2553. var x = a.ID.toLowerCase();
  2554. var y = b.ID.toLowerCase();
  2555. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  2556. }
  2557. function sortByName(a, b)
  2558. {
  2559. var x = a.name.toLowerCase();
  2560. var y = b.name.toLowerCase();
  2561. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  2562. }
  2563. function sortByGoogleID(a, b)
  2564. {
  2565. var x = a.googleID;
  2566. var y = b.googleID;
  2567. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  2568. }
  2569. function sortBySubmitted(a, b)
  2570. {
  2571. var x = a.submitted;
  2572. var y = b.submitted;
  2573. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  2574. }
  2575. function sortByTeamName(a, b)
  2576. {
  2577. var x = a.teamName;
  2578. var y = b.teamName;
  2579. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  2580. }
  2581. function sortByToStudentName(a, b)
  2582. {
  2583. var x = a.toStudentName;
  2584. var y = b.toStudentName;
  2585. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  2586. }
  2587. function toggleDeleteCourseConfirmation(courseID) {
  2588. var s = confirm("Are you sure you want to delete the course, \"" + courseID + "\"?");
  2589. if (s == true) {
  2590. doDeleteCourse(courseID);
  2591. } else {
  2592. clearStatusMessage();
  2593. }
  2594. document.getElementById(DIV_COURSE_MANAGEMENT).scrollIntoView(true);
  2595. }
  2596. function toggleDeleteEvaluationConfirmation(courseID, name) {
  2597. var s = confirm("Are you sure you want to delete the evaluation?");
  2598. if (s == true) {
  2599. doDeleteEvaluation(courseID, name);
  2600. } else {
  2601. clearStatusMessage();
  2602. }
  2603. document.getElementById(DIV_EVALUATION_MANAGEMENT).scrollIntoView(true);
  2604. }
  2605. function toggleDeleteAllStudentsConfirmation(courseID) {
  2606. var s = confirm("Are you sure you want to remove all students from this course?");
  2607. if (s == true) {
  2608. doDeleteAllStudents(courseID);
  2609. } else {
  2610. clearStatusMessage();
  2611. }
  2612. document.getElementById(DIV_COURSE_INFORMATION).scrollIntoView(true);
  2613. }
  2614. function toggleDeleteStudentConfirmation(courseID, studentEmail, studentName) {
  2615. var s = confirm("Are you sure you want to remove " + studentName + " from the course?");
  2616. if (s == true) {
  2617. doDeleteStudent(courseID, studentEmail);
  2618. } else {
  2619. clearStatusMessage();
  2620. }
  2621. document.getElementById(DIV_COURSE_INFORMATION).scrollIntoView(true);
  2622. }
  2623. function toggleEvaluationSummaryListViewByType(submissionList, summaryList, status, commentsEnabled) {
  2624. if (evaluationResultsViewStatus == evaluationResultsView.reviewee) {
  2625. evaluationResultsViewStatus = evaluationResultsView.reviewer;
  2626. } else {
  2627. evaluationResultsViewStatus = evaluationResultsView.reviewee;
  2628. }
  2629. toggleSortEvaluationSummaryListByTeamName(submissionList, summaryList, status, commentsEnabled)
  2630. }
  2631. function toggleInformStudentsOfEvaluationChanges(courseID, name)
  2632. {
  2633. var s = confirm("Do you want to send e-mails to the students to inform them of changes to the evaluation?");
  2634. if (s == true) {
  2635. doInformStudentsOfEvaluationChanges(courseID, name);
  2636. } else {
  2637. clearStatusMessage();
  2638. }
  2639. document.getElementById(DIV_EVALUATION_MANAGEMENT).scrollIntoView(true);
  2640. }
  2641. function togglePublishEvaluation(courseID, name, publish, reload) {
  2642. // var s = confirm("Are you sure you want to publish the evaluation?");
  2643. // if (s == true) {
  2644. // doPublishEvaluation(courseID, name);
  2645. // } else {
  2646. // clearStatusMessage();
  2647. // }
  2648. if (publish) {
  2649. var s = confirm("Are you sure you want to publish the evaluation?");
  2650. if (s == true) {
  2651. doPublishEvaluation(courseID, name, reload);
  2652. } else {
  2653. clearStatusMessage();
  2654. }
  2655. }
  2656. else {
  2657. var s = confirm("Are you sure you want to unpublish the evaluation?");
  2658. if(s == true) {
  2659. doUnpublishEvaluation(courseID, name, reload);
  2660. } else {
  2661. clearStatusMessage();
  2662. }
  2663. }
  2664. document.getElementById(DIV_EVALUATION_MANAGEMENT).scrollIntoView(true);
  2665. }
  2666. function toggleRemindStudents(courseID, evaluationName) {
  2667. var s = confirm("Send e-mails to remind students who have not submitted their evaluations?");
  2668. if (s == true) {
  2669. doRemindStudents(courseID, evaluationName);
  2670. } else {
  2671. clearStatusMessage();
  2672. }
  2673. document.getElementById(DIV_EVALUATION_MANAGEMENT).scrollIntoView(true);
  2674. }
  2675. function toggleSendRegistrationKeysConfirmation(courseID) {
  2676. var s = confirm("Are you sure you want to send registration keys to all the unregistered students for them to join your course?");
  2677. if (s == true) {
  2678. doSendRegistrationKeys(courseID);
  2679. setStatusMessage("Emails have been sent to unregistered students.");
  2680. } else {
  2681. clearStatusMessage();
  2682. }
  2683. }
  2684. function toggleSortCoursesByID(courseList) {
  2685. printCourseList(courseList.sort(sortByID), COORDINATOR);
  2686. courseSortStatus = courseSort.ID;
  2687. document.getElementById("button_sortcourseid").setAttribute("class", "buttonSortAscending");
  2688. }
  2689. function toggleSortCoursesByName(courseList) {
  2690. printCourseList(courseList.sort(sortByName), COORDINATOR);
  2691. courseSortStatus = courseSort.name;
  2692. document.getElementById("button_sortcoursename").setAttribute("class", "buttonSortAscending");
  2693. }
  2694. function toggleSortEvaluationSummaryListByAverage(submissionList, summaryList, status, commentsEnabled) {
  2695. printEvaluationSummaryForm(submissionList, summaryList.sort(sortByAverage), status, commentsEnabled, REVIEWEE);
  2696. evaluationResultsSummaryListSortStatus = evaluationResultsSummaryListSort.average;
  2697. document.getElementById("button_sortaverage").setAttribute("class", "buttonSortAscending");
  2698. }
  2699. function toggleSortEvaluationSummaryListByDiff(submissionList, summaryList, status, commentsEnabled) {
  2700. printEvaluationSummaryForm(submissionList, summaryList.sort(sortByDiff), status, commentsEnabled, REVIEWEE);
  2701. evaluationResultsSummaryListSortStatus = evaluationResultsSummaryListSort.diff;
  2702. document.getElementById("button_sortdiff").setAttribute("class", "buttonSortAscending");
  2703. }
  2704. function toggleSortEvaluationSummaryListByFromStudentName(submissionList, summaryList, status, commentsEnabled) {
  2705. var type;
  2706. if (evaluationResultsViewStatus == evaluationResultsView.reviewee) {
  2707. type = REVIEWEE;
  2708. } else {
  2709. type = REVIEWER;
  2710. }
  2711. printEvaluationSummaryForm(submissionList, summaryList.sort(sortByFromStudentName), status, commentsEnabled, type);
  2712. evaluationResultsSummaryListSortStatus = evaluationResultsSummaryListSort.name;
  2713. document.getElementById("button_sortname").setAttribute("class", "buttonSortAscending");
  2714. }
  2715. function toggleSortEvaluationSummaryListBySubmitted(submissionList, summaryList, status, commentsEnabled) {
  2716. printEvaluationSummaryForm(submissionList, summaryList.sort(sortBySubmitted), status, commentsEnabled, REVIEWER);
  2717. evaluationResultsSummaryListSortStatus = evaluationResultsSummaryListSort.submitted;
  2718. document.getElementById("button_sortsubmitted").setAttribute("class", "buttonSortAscending");
  2719. }
  2720. function toggleSortEvaluationSummaryListByTeamName(submissionList, summaryList, status, commentsEnabled) {
  2721. if (evaluationResultsViewStatus == evaluationResultsView.reviewee) {
  2722. type = REVIEWEE;
  2723. } else {
  2724. type = REVIEWER;
  2725. }
  2726. printEvaluationSummaryForm(submissionList, summaryList.sort(sortByTeamName), status, commentsEnabled, type);
  2727. evaluationResultsSummaryListSortStatus = evaluationResultsSummaryListSort.teamName;
  2728. document.getElementById("button_sortteamname").setAttribute("class", "buttonSortAscending");
  2729. }
  2730. function toggleSortEvaluationSummaryListByToStudentName(submissionList, summaryList, status, commentsEnabled) {
  2731. var type;
  2732. if (evaluationResultsViewStatus == evaluationResultsView.reviewee) {
  2733. type = REVIEWEE;
  2734. } else {
  2735. type = REVIEWER;
  2736. }
  2737. printEvaluationSummaryForm(submissionList, summaryList.sort(sortByToStudentName), status, commentsEnabled, type);
  2738. evaluationResultsSummaryListSortStatus = evaluationResultsSummaryListSort.name;
  2739. document.getElementById("button_sortname").setAttribute("class", "buttonSortAscending");
  2740. }
  2741. function toggleSortEvaluationsByCourseID(evaluationList) {
  2742. printEvaluationList(evaluationList.sort(sortByCourseID));
  2743. evaluationSortStatus = evaluationSort.courseID;
  2744. document.getElementById("button_sortcourseid").setAttribute("class", "buttonSortAscending");
  2745. }
  2746. function toggleSortEvaluationsByName(evaluationList) {
  2747. printEvaluationList(evaluationList.sort(sortByName));
  2748. evaluationSortStatus = evaluationSort.name;
  2749. document.getElementById("button_sortname").setAttribute("class", "buttonSortAscending");
  2750. }
  2751. function toggleSortStudentsByName(studentList, courseID) {
  2752. printStudentList(studentList.sort(sortByName), courseID);
  2753. studentSortStatus = studentSort.name;
  2754. document.getElementById("button_sortstudentname").setAttribute("class", "buttonSortAscending");
  2755. }
  2756. function toggleSortStudentsByStatus(studentList, courseID) {
  2757. printStudentList(studentList.sort(sortByGoogleID), courseID);
  2758. studentSortStatus = studentSort.status;
  2759. document.getElementById("button_sortstudentstatus").setAttribute("class", "buttonSortAscending");
  2760. }
  2761. function toggleSortStudentsByTeamName(studentList, courseID) {
  2762. printStudentList(studentList.sort(sortByTeamName), courseID);
  2763. studentSortStatus = studentSort.teamName;
  2764. document.getElementById("button_sortstudentteam").setAttribute("class", "buttonSortAscending");
  2765. }
  2766. function toggleViewAddedStudents() {
  2767. var currentClass = document.getElementById('button_viewaddedstudents').getAttribute("class");
  2768. if (currentClass == "plusButton") {
  2769. document.getElementById("button_viewaddedstudents").setAttribute("class", "minusButton");
  2770. document.getElementById("rowAddedStudents").style.display = "";
  2771. } else {
  2772. document.getElementById("button_viewaddedstudents").setAttribute("class", "plusButton");
  2773. document.getElementById("rowAddedStudents").style.display = "none";
  2774. }
  2775. }
  2776. function toggleViewEditedStudents() {
  2777. var currentClass = document.getElementById('button_vieweditedstudents').getAttribute("class");
  2778. if (currentClass == "plusButton") {
  2779. document.getElementById("button_vieweditedstudents").setAttribute("class", "minusButton");
  2780. document.getElementById("rowEditedStudents").style.display = "";
  2781. } else {
  2782. document.getElementById("button_vieweditedstudents").setAttribute("class", "plusButton");
  2783. document.getElementById("rowEditedStudents").style.display = "none";
  2784. }
  2785. }
  2786. /*
  2787. * Returns
  2788. *
  2789. * 0: successful 1: server error
  2790. *
  2791. */
  2792. function unarchiveCourse(courseID)
  2793. {
  2794. if(xmlhttp)
  2795. {
  2796. xmlhttp.open("POST","teammates",false);
  2797. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
  2798. xmlhttp.send("operation=" + OPERATION_COORDINATOR_UNARCHIVECOURSE + "&" + COURSE_ID + "=" + encodeURIComponent(courseID));
  2799. return handleUnarchiveCourse();
  2800. }
  2801. }
  2802. window.onload=function()
  2803. {
  2804. displayCoursesTab();
  2805. initializetooltip();
  2806. }
  2807. // DynamicDrive JS mouse-hover
  2808. document.onmousemove = positiontip;