Team:UNITN-Trento/JS/Notebook

From 2013.igem.org

Revision as of 12:13, 23 September 2013 by Ggirelli (Talk | contribs)

/**

* Hides/Shows labposts based on active filter
* @return none
*/

function useFilters() {

   if ($("#tn-active-filters-F").val() == "" && $("#tn-active-filters-T").val() == "" && $("#tn-active-filters-D").val() == "") {
       //Scroll through the  posts
       $(".tn-post").each(function() {
           $(this).css("display", "block");
       });
   } else {
       //Get active filters
       Ffilters = $("#tn-active-filters-F").val().split("-");
       Tfilter = $("#tn-active-filters-T").val();
       Dfilter = $("#tn-active-filters-D").val();
       //Scroll through the  posts
       $(".tn-post").each(function() {
           faces = $(this).attr("data-user").split("-");
           facesLow = [];
           for (var i = 0; i < faces.length; i++) {
               facesLow.push(faces[i].toLowerCase());
           }
           tags = $(this).attr("data-tag").split("-");
           date = $(this).attr("data-date");
           keepThis1 = true;
           if ($("#tn-active-filters-F").val() != "") {
               //If one of the active filters is not present, hide the post
               for (var i = 0; i < Ffilters.length; i++) {
                   if (facesLow.indexOf(Ffilters[i].toLowerCase()) == -1) {
                       keepThis1 = false;
                   }
               }
           }
           keepThis2 = true;
           if (Tfilter != "") {
               keepThis2 = false;
               //If the active tag filter is not present, hide the post
               for (var k = 0; k < tags.length; k++) {
                   if (tags[k].toLowerCase().trim() === Tfilter && !keepThis2) {
                       keepThis2 = true;
                   }
               }
           }
           keepThis3 = true;
           if (Dfilter != "") {
               keepThis3 = false;
               if (date == Dfilter) {
                   keepThis3 = true;
               }
           }
           keepThis = false;
           //Combine tags and faces filters
           if (keepThis1 && keepThis2 && keepThis3) {
               keepThis = true;
           }
           //Act
           if (!keepThis) {
               $(this).css("display", "none");
           } else {
               $(this).css("display", "block");
           }
       });
   }

}

/**

* Changes border color of every image with the same source of the clicked one
* @param Object parent the <a> tag containing the image
* @param String color
*/

function setBorder(parent, color) {

   img = parent.children();
   $("img").each(function() {
       if ($(this).attr("src") == img.attr("src")) {
           $(this).css("border", "2px solid " + color);
       }
   });

}

/**

* Rebuilds the calendar changing the month
* @param Integer yyyy
* @param Integer month
* @param Integer days
*/

function setMonth(yyyy, month, days) {

   //reset
   $("#tn-calendar-table td").text("");
   $("#tn-calendar-table td").attr("data-date", "");
   //Start
   var days = 0;
   //Set 
   switch (month) {
       case 1:
           {
               $(".tn-month.tn-name").text("January 2013");
               days = 31;
               break;
           }
       case 2:
           {
               $(".tn-month.tn-name").text("February 2013");
               days = 30;
               break;
           }
       case 3:
           {
               $(".tn-month.tn-name").text("March 2013");
               days = 31;
               break;
           }
       case 4:
           {
               $(".tn-month.tn-name").text("April 2013");
               days = 30;
               break;
           }
       case 5:
           {
               $(".tn-month.tn-name").text("May 2013");
               days = 31;
               break;
           }
       case 6:
           {
               $(".tn-month.tn-name").text("June 2013");
               days = 30;
               break;
           }
       case 7:
           {
               $(".tn-month.tn-name").text("July 2013");
               days = 31;
               break;
           }
       case 8:
           {
               $(".tn-month.tn-name").text("August 2013");
               days = 31;
               break;
           }
       case 9:
           {
               $(".tn-month.tn-name").text("September 2013");
               days = 30;
               break;
           }
       case 10:
           {
               $(".tn-month.tn-name").text("October 2013");
               days = 31;
               break;
           }
       case 11:
           {
               $(".tn-month.tn-name").text("November 2013");
               days = 30;
               break;
           }
       case 12:
           {
               $(".tn-month.tn-name").text("December 2013");
               days = 31;
               break;
           }
   }
   var week = 1;
   //$("#week-"+week+" td").get(0).text("Prova");
   for (var i = 1; i <= days; i++) {
       pos = new Date(yyyy, month - 1, i, 0, 0, 0, 0).getDay();
       $("#week-" + week + " td").eq(pos).text(i);
       smonth = "" + month;
       si = "" + i;
       if (smonth.length == 1) {
           smonth = "0" + smonth;
       }
       if (si.length == 1) {
           si = "0" + si;
       }
       $("#week-" + week + " td").eq(pos).attr("data-date", yyyy + "-" + smonth + "-" + si);
       if (pos == 6) {
           week++;
       }
   }
   $("#tn-calendar-table").attr("data-month", month);

}

/**

*
*/

function getJSONstepped(options) {

   //Verify options
   var i, data_list;
   if (undefined === options.a_list) {
       return;
   } else {
       var a_list = options.a_list;
   }
   if (undefined === options.startingIndex) {
       i = 0;
   } else {
       i = options.startingIndex;
   }
   if (undefined === options.data_list) {
       data_list = [];
   } else {
       data_list = options.data_list;
   }
   if (undefined === options.success) {
       return;
   } else {
       var success = options.success;
   }
   if (undefined === options.errorCounter) {
       var errorCounter = 0;
   } else {
       var errorCounter = options.errorCounter;
   }
   if (undefined === options.errorList) {
       var errorList = [];
   } else {
       var errorList = options.errorList;
   }
   if ($(a_list).length > i) {
       //Get url
       var href = $(a_list).eq(i).attr('href');
       //Get id
       var id = href.split("/");
       id = id[id.length - 1];
       //Make AJAX request
       $.ajax({
           type: 'GET',
           dataType: 'json',
           url: href + "?action=raw&ctype=text/javascript",
           timeout: 3000,
           success: function(data, textStatus) {
               data.id = id;
               data_list.push(data);
               getJSONstepped({
                   'a_list': a_list,
                   'startingIndex': i + 1,
                   'data_list': data_list,
                   'success': function(a) {
                       options.success(a);
                   },
                   'errorCounter' : errorCounter,
                   'errorList' : errorList
               });
           },
           error: function(data, textStatus) {
               //alert(id + " - " + textStatus);
               if ( "timeout" === textStatus ) {
                   errorCounter += 1;
               }
               errorList.push(textStatus);
               getJSONstepped({
                   'a_list': a_list,
                   'startingIndex': i + 1,
                   'data_list': data_list,
                   'success': function(a) {
                       options.success(a);
                   },
                   'errorCounter' : errorCounter,
                   'errorList' : errorList
               });
           }
       });
   } else {
       if ( 0 != errorCounter ) {
           alert(errorCounter + " 'timeout' errors occurred.");
       }
       success(data_list);
   }

}

/**

*
*/

function fillBook(month) {

   //empty book
   $("#aj_cont center").remove();
   //Shows loading message
   $("#aj_load").fadeIn();
   //Show correct active timeSelect buttons and de-activate all the timeSelect buttons
   $(".tn-button").removeClass("active");
   $(".tn-button."+month).addClass("active");
   $(".tn-button").removeAttr("href");
   //Remove tags
   $("#tn-filter-tags option").remove();
   $("#tn-filter-tags").append("<option value=></option>")
   //Set correct month on the calendar
   switch ( month ) {
       case 'may': {
           monthn = 5;
           break;
       }
       case 'june': {
           monthn = 6;
           break;
       }
       case 'july': {
           monthn = 7;
           break;
       }
       case 'august': {
           monthn = 8;
           break;
       }
       case 'september': {
           monthn = 9;
           break;
       }
   }
   //Creates the calendar
   var today = new Date();
   var dd = today.getDate(),
       wd = today.getDay();
   var mm = today.getMonth() + 1;
   var yyyy = today.getFullYear();
   setMonth(yyyy, monthn);
   /**************************************/
   /**GET THE POSTs BACK IN THE TEMPLATE**/
   /**************************************/
   var c = 1;
   var calenMap = {};
   var calenOrdered = [];
   //Get posts from AJAX
   getJSONstepped({
       'a_list': "#aj_index_" + month + " a",
       'success': function(data_list) {
           var last_id = 0,
               href = "";
           //Iterate through all posts and order them
           $(data_list).each(function(i, p) {
               // alert("s"+p.id);
               if (last_id < parseInt(p.id)) {
                   last_id = parseInt(p.id);
               }
               //Get post date
               date = p.date.split("-");
               calenMap[date[0] + ":" + date[1] + ":" + date[2] + ":" + i] = p;
               calenOrdered.push(date[0] + ":" + date[1] + ":" + date[2] + ":" + i);
           });
           //Add posts to the page in an ordered way
           calenOrdered.sort();
           $("#aj_load").fadeOut();
           for (var key in calenOrdered) {
               post = calenMap[calenOrdered[key]];
               post.content = post.content.split("
{{{1}}}
{{{2}}}
").join("</center></div></div>");
div = $('
').attr('id', 'tn-post-' + post.date + "-" + post.author).addClass('tn-post').attr('data-user', post.author).attr('data-title', post.title).attr('data-date', post.date).attr('data-tag', post.tags).append($("
").addClass('tn-text').html(post.content)).prepend($("<a href='https://2013.igem.org/Team:UNITN-Trento/Notebook/Labposts/0" + monthn + "/" + post.id + "?action=edit' class='tn-editpost'><img src='https://static.igem.org/mediawiki/2013/0/04/Tn-20130709-edit_button.png' title='Edit' alt='Edit' /></a>")); $("
").append($(div)).prependTo($("#aj_cont"));
               setPost('#tn-post-' + post.date + "-" + post.author);
               // alert("p"+post.id);
           }
           /*Spoiler JS*/
           $(".tn-spoiler div").slideUp();
           $(".tn-spoiler a").click(function(e) {
               e.preventDefault();
               $(".tn-spoiler-active").removeClass("tn-spoiler-active");
               $(this).parent().addClass("tn-spoiler-active");
               $(".tn-spoiler").not(".tn-spoiler-active").children("div").slideUp();
               $(".tn-spoiler-active").children("div").slideToggle();
           });
           //"Add Post" Buttons
// $("#tn-content").prepend("
<a href='https://2013.igem.org/Team:UNITN-Trento/Notebook/Labposts/" + (parseInt(last_id) + 1) + "?action=edit&preload=Team:UNITN-Trento/Help/Labpost_AJAX' class='tn-addpost'>Add new labPost</a>
".replace("amp;", "")); // $("#tn-content").append("
<a href='https://2013.igem.org/Team:UNITN-Trento/Notebook/Labposts/" + (parseInt(last_id) + 1) + "?action=edit&preload=Team:UNITN-Trento/Help/Labpost_AJAX' class='tn-addpost'>Add new labPost</a>
".replace("amp;", ""));
           /*************/
           /**FILTERS 1**/
           /*************/
           //Add tags to the select filter option
           var added = [];
           $(".tag").each(function() {
               if (added.indexOf($(this).text().toLowerCase().trim()) == -1) {
                   added.push($(this).text().toLowerCase().trim());
                   $("#tn-filter-tags").append("<option value='" + $(this).text().toLowerCase().trim() + "'>" + $(this).text().toLowerCase().trim() + "</option>");
               }
           });
           
           //Set TAGS filters
           $("#tn-filter-tags").change(function(e) {
               e.preventDefault();
               $("#tn-active-filters-T").val($("#tn-filter-tags").val());
               //Apply active filters
               useFilters();
           });
           //Reactivate timeSelect buttons
           $(".tn-button").each(function() {
               $(this).attr("href" , $(this).attr("data-href"));
           });
       }
   });

}

/**

*
*/

function addPost() {

   //Get month as string
   month = $(".tn-button.active").attr('data-href').split("'")[1];
   //Get month number
   switch ( month ) {
       case 'may': {
           monthn = "05";
           break;
       }
       case 'june': {
           monthn = "06";
           break;
       }
       case 'july': {
           monthn = "07";
           break;
       }
       case 'august': {
           monthn = "08";
           break;
       }
       case 'september': {
           monthn = "09";
           break;
       }
   }
   //Get last_id of actve.month's post
   var last_id = 0;
   $("#aj_index_"+month+" a").each(function() {
       lhref = $(this).attr('href').split("/");
       id = lhref[lhref.length - 1];
       if ( last_id < parseInt(id) ) { last_id = parseInt(id); }
   });
   //Go to edit of new post
   document.location.href = "https://2013.igem.org/Team:UNITN-Trento/Notebook/Labposts/"+monthn+"/"+(last_id + 1)+"?action=edit&preload=Team:UNITN-Trento/Help/Labpost_AJAX";

}


//Acts when the document is loaded $(document).ready(function() {

   /***********/
   /**FILTERS**/
   /***********/
   //Select all the FACES filters
   $(".faces").each(function() {
       //Set the click event
       $(this).click(function(e) {
           //Rewrite default
           e.preventDefault();
           faceBox = $(this);
           hidBox = $("#tn-active-filters-F");
           name = faceBox.attr("href");
           //If there is no filter active
           if (hidBox.val() == "") {
               //Add the current to the active filters
               hidBox.val(name);
               setBorder(faceBox, "rgb(191, 27, 57)");
           } else {
               //If there are active filters, get them
               arnames = hidBox.val().split("-");
               //If the current is not active, activate it
               if (arnames.indexOf(name) == -1) {
                   hidBox.val(hidBox.val() + "-" + name);
                   setBorder(faceBox, "rgb(191, 27, 57)");
               } else {
                   //If the current is active, deactivate it
                   arnames.splice(arnames.indexOf(name), 1);
                   hidBox.val(arnames.join("-"));
                   setBorder(faceBox, "rgb(240, 242, 223)");
               }
           }
           //Apply active filters
           useFilters();
       });
   });
   /**********/
   /*CALENDAR*/
   /**********/
   //Creates the calendar
   var today = new Date();
   var dd = today.getDate(),
       wd = today.getDay();
   var mm = today.getMonth() + 1;
   var yyyy = today.getFullYear();
   setMonth(yyyy, mm);
   //Click
   $(".tn-month.tn-fw a").click(function(e) {
       e.preventDefault();
       $("#tn-calendar-table td").css("border", "1px solid rgb(3, 140, 126)");
       setMonth(yyyy, parseInt($("#tn-calendar-table").attr("data-month")) + 1);
   });
   $(".tn-month.tn-bw a").click(function(e) {
       e.preventDefault();
       $("#tn-calendar-table td").css("border", "1px solid rgb(3, 140, 126)");
       setMonth(yyyy, parseInt($("#tn-calendar-table").attr("data-month")) - 1);
   });
   //Set link on calendar
   $("#tn-calendar-table td").each(function() {
       $(this).click(function(e) {
           e.preventDefault();
           $("#tn-calendar-table td").css("border", "1px solid rgb(3, 140, 126)");
           if ($("#tn-active-filters-D").val() == $(this).attr("data-date")) {
               $("#tn-active-filters-D").val("");
           } else {
               $(this).css("border", "1px solid rgb(191, 27, 57)");
               $("#tn-active-filters-D").val($(this).attr("data-date"));
           }
           //Apply active filters
           useFilters();
       });
   });
   /*FILL BOOK*/
   fillBook('august');
   /**SCROLL TO POST BASED ON HASH**/
   //$("html,body").scrollTo(document.location.hash.replace("#", ""), document.location.hash.replace("#", ""));

});

// //When hash changes, scroll to correct div // oHch(function() { // $("html,body").scrollTo(document.location.hash.replace("#", ""), document.location.hash.replace("#", "")); // });