app/soc/content/js/duplicate-slots-090825.js
changeset 2801 0ee67cc9bd20
parent 2800 cd9eed2b787e
child 2804 92397646e5dc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/soc/content/js/duplicate-slots-090825.js	Tue Aug 25 16:15:07 2009 +0100
@@ -0,0 +1,262 @@
+(function () {
+  var duplicateSlots = window.duplicateSlots = function () {
+  };
+  // this variable will contain all the org details, and filled
+  // incrementally
+  var orgs_details = {};
+  // this variable will contain all student/proposal data details,
+  // filled incrementally
+  var assigned_proposals = [];
+
+  // public function to output actual HTML out of the data (cached or not)
+  duplicateSlots.showDuplicatesHtml =
+    function (orgs_details, student, student_key, proposals) {
+      /*jslint undef:false */
+      if (html_string === '') {
+        jQuery("#div_duplicate_slots").html('');
+        html_string = '<ul>';
+      }
+      html_string += [
+        '<li>',
+        '  Student: ',
+        '    <strong>',
+        '      <a href="/student/show/', student_key, '">', student.name,
+        '</a>',
+        '    </strong> ',
+        '(<a href="mailto:', student.contact, '">', student.contact, '</a>)'
+      ].join("");
+      html_string += '<ul>';
+      jQuery(proposals).each(
+        function (intIndex, proposal) {
+          html_string += [
+            '<li>',
+            '  Organization: ',
+            '    <a href="/org/show/', proposal.org_key, '">',
+            orgs_details[proposal.org_key].name,
+            '</a>, admin: ', orgs_details[proposal.org_key].admin_name,
+            ' (<a href="mailto:',
+            orgs_details[proposal.org_key].admin_email,
+            '">',
+            orgs_details[proposal.org_key].admin_email, '</a>)</li>'
+          ].join("");
+          html_string += [
+            '<ul>',
+            '  <li>',
+            'Proposal: ',
+            '<a href="/student_proposal/show/', proposal.proposal_key, '">',
+            proposal.proposal_title, '</a>',
+            '  </li>',
+            '</ul>'
+          ].join("");
+        }
+      );
+      html_string += '</ul></li>';
+      html_string += '</ul>';
+      jQuery("#div_duplicate_slots").html(html_string);
+      /*jslint undef:true */
+    };
+
+  // private function to generate the JSON to send for caching and calling
+  // the actual function that will print the data
+  function printDuplicatesAndSendJSON() {
+    // JSON skeleton that need to be sent to the server
+    var to_json = {
+      "data": {
+        "orgs" : orgs_details,
+        "students": {}
+      }
+    };
+    // for every student...
+    jQuery.each(assigned_proposals, function (student_key, student) {
+      var accepted_proposals = student.proposals.length;
+      // if accepted proposal are less than 2, then ignore and
+      // continue the iteration
+      if (accepted_proposals < 2) {
+        return true;
+      }
+      // push this student to the caching JSON
+      to_json.data.students[student_key] = student;
+      var proposals = student.proposals;
+      // call the function that prints the output html
+      duplicateSlots.showDuplicatesHtml(
+        orgs_details, student, student_key, proposals
+      );
+    });
+    /*jslint undef:false */
+    if (html_string === "") {
+    /*jslint undef:true */
+      jQuery("#div_duplicate_slots")
+        .html("<strong>No duplicate slots found</strong>");
+    }
+    // at the end, send the JSON for caching purposes
+    jQuery.ajax({
+      url: location.href,
+      type: 'POST',
+      processData: true,
+      data: {result: JSON.stringify(to_json)},
+      contentType: 'application/json',
+      dataType: 'json'
+    });
+  }
+
+  // private function to load a JSON and pushing the data to the
+  // private global variables
+  function loadSingleJSONData(data) {
+    if (data) {
+      // pushing org details
+      jQuery.each(data.data.orgs, function (org_key, organization) {
+        orgs_details[org_key] = organization;
+      });
+      // pushing proposals
+      jQuery(data.data.proposals).each(
+        function (intIndex, proposal) {
+          // if this student_key is not yet present
+          if (assigned_proposals[proposal.student_key] === undefined) {
+            // create the object and insert general info
+            assigned_proposals[proposal.student_key] = {};
+            assigned_proposals[proposal.student_key].name =
+              proposal.student_name;
+            assigned_proposals[proposal.student_key].contact =
+              proposal.student_contact;
+            assigned_proposals[proposal.student_key].proposals = [];
+          }
+          // anyway, push the accepted proposals
+          assigned_proposals[proposal.student_key].proposals.push(
+            {
+              "org_key" : proposal.org_key,
+              "proposal_key" : proposal.key_name,
+              "proposal_title": proposal.proposal_title
+            }
+          );
+        }
+      );
+    }
+  }
+
+  function showDuplicates(url_to_query, OFFSET_LENGTH, NUMBER_OF_ORGS) {
+    var current_offset = 0;
+    orgs_details = {};
+    assigned_proposals = [];
+
+    // Here Ajax call is handled
+    setTimeout(
+      function () {
+        jQuery.ajax({
+          cache: false,
+          mode: "sync",
+          type: "GET",
+          timeout: 1000000,
+          dataType: "json",
+          url: [
+            "/program/assigned_proposals/", url_to_query,
+            "?limit=", OFFSET_LENGTH,
+            "&offset=", current_offset
+          ].join(""),
+          success: function (data, textStatus) {
+            if (data) {
+              // Load JSON data
+              loadSingleJSONData(data);
+            }
+          },
+          error: function (XMLHttpRequest, textStatus, errorThrown) {
+            // if there is an error return the button and
+            // leave a try again message
+            if (XMLHttpRequest !== undefined) {
+              jQuery("#id_button_duplicate_slots").fadeIn("slow",
+                function () {
+                  jQuery("#description_done").html([
+                    "<strong class='error'> ",
+                    "Error encountered, try again",
+                    "</strong>"
+                  ].join(""));
+                }
+              );
+            }
+          }
+        });
+        current_offset += OFFSET_LENGTH;
+        if (current_offset < NUMBER_OF_ORGS) {
+          setTimeout(arguments.callee, 1);
+        }
+      },
+      1
+    );
+    // This prevent page reloading after each ajax call
+    return false;
+  }
+
+  // public function to begin iterating load of JSONs and then call printing
+  // of duplicates
+
+  duplicateSlots.showDuplicatesInit = function () {
+    /*jslint undef:false */
+    html_string = '';
+    // Remember this object for Javascript scoping
+    var this_object = this;
+    var NUMBER_OF_ORGS = number_of_orgs;
+    var OFFSET_LENGTH = offset_length;
+    /*jslint undef:true */
+    // Variables to handle progress bar updating
+    var ITERATIONS = (number_of_orgs % offset_length) === 0 ?
+      Math.floor(number_of_orgs / offset_length) :
+      Math.floor(number_of_orgs / offset_length) + 1;
+
+    if (ITERATIONS === 0) {
+      jQuery("#div_duplicate_slots")
+        .html("<strong>No org slots to process</strong>");
+      return;
+    }
+
+    var successful_calls = 0;
+
+    jQuery("#id_button_duplicate_slots").fadeOut("slow",
+      function () {
+        jQuery("#duplicates_progress_bar").progressBar(0);
+        jQuery("#description_done").html("");
+        // For every ajax success, bind this function to update user feedback
+        jQuery(this).bind("ajaxSuccess", function () {
+          successful_calls++;
+          var percentage = Math.floor(100 * (successful_calls) / (ITERATIONS));
+          jQuery("#duplicates_progress_bar").progressBar(percentage);
+          jQuery("#description_progressbar").html([
+            " Processed orgs chunk ", successful_calls, "/", ITERATIONS
+          ].join(""));
+          // If this is the last call, feedback the user and
+          // print the duplicates data
+          if (successful_calls === ITERATIONS) {
+            jQuery("#applications_progress_bar").fadeOut("slow",
+              function () {
+                jQuery("#duplicates_progress_bar").progressBar(0);
+                jQuery("#id_button_duplicate_slots").fadeIn("slow");
+              }
+            );
+            jQuery("#description_progressbar").html("");
+            jQuery("#description_done").html("<strong> Done!</strong>");
+            jQuery("#duplicates_progress_bar").fadeOut("slow",
+              function () {
+                jQuery("#id_button_duplicate_slots").val("Recalculate").fadeIn(
+                  "slow",
+                  function () {
+                    // Call printing to HTML function with correct scope
+                    printDuplicatesAndSendJSON.call(this_object);
+                  }
+                );
+              }
+            );
+          }
+        });
+        // Call the showDuplicates function for the first time
+        // with correct scope
+        jQuery("#duplicates_progress_bar").fadeIn(
+          "slow",
+          showDuplicates.apply(
+            this_object,
+            /*jslint undef:false */
+            [url_to_query, OFFSET_LENGTH, NUMBER_OF_ORGS]
+            /*jslint undef:true */
+          )
+        );
+      }
+    );
+  };
+}());
\ No newline at end of file