Team:EPF-Lausanne/Template/script.js

From 2012.igem.org

Revision as of 00:00, 27 September 2012 by Sander.kromwijk (Talk | contribs)

//Generate private namespace window.EPFL = (function(){

 //Little hack to stop MediaWiki from replacing ampersands...
 var amp = unescape("%26");
 return {
   namingRegex: /^(\/|([A-Z][a-z]*))*[0-9]*$/,
   dateRegex: /^([0-9]+) ([A-Z][a-z]+) ([0-9]+)$/,
   registerNewPageButton: function(titleID, buttonID, base, preload, check){
     $(buttonID).click(function(){
       if(check != undefined){
         if(!check(base, $(titleID).val())){
           if(!confirm("The title doesn't seem to follow the naming conventions.\nAre you sure you want to create this page?")){
             return;
           }
         }
       }
       window.location.href = "/wiki/index.php?title="+base+"/"+$(titleID).val()+amp+"action=edit"+amp+"preload="+preload;
     });
   },
   checkNamingConventions: function(base, title){
     return EPFL.namingRegex.test(title);
   },
   getPage: function(){
     var title = $(".firstHeading").text();
     var prefix = "Team:EPF-Lausanne/";
     title = title.substr(prefix.length);
     titleParts = title.split("/");
     
     if(titleParts.length > 0 && titleParts[0] == "Template"){
       titleParts.shift();
     }
     return titleParts;
   },
   setup: function(){
     EPFL.setupProtocols();
     EPFL.setupCalendar();
     EPFL.setupPlanning();
     EPFL.setupTitle();
     EPFL.setupTOC();
     EPFL.setupNotebookNavButtons();
     $('p')
       .filter(function(){
         return $.trim($(this).text()) ===  && $.trim($(this).html()).length < 10;
       })
       .remove();
   },
   setupTOC: function(){
     var toc = $("#toc");
     toc.remove();
     $(".paper").prepend(toc);
   },
   setupNotebookNavButtons: function(){
     var months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
     //Note: Valid for 2012, if you're reusing this script, update this:
     var days = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
     
     var exists = function(day, month, year){
       if(year != 2012) return false;
       if(month <= 6){
         if(month == 5 && day >= 30) return true;
         if(month == 6 && (day <= 1 || day == 28 || day == 29)) return true;
         return false;
       }
       if(month >= 10) return false;
       if(month == 7){
         if(day >= 4 && day <= 7) return true;
         if(day >= 10 && day <= 13) return true;
         if(day >= 16) return true;
         return false;
       }
       if(month == 8) return true;
       if(month == 9 && day <= 26) return true;
       return false;
     };
     
     var getCorrectDate = function(day, month, year){
         if(day < 1){
           month--;
           day = days[month];
         }
         if(day > days[month]){
           month++;
           day = 1;
         }
         if(month < 1){
           year--;
           month = 12;
         }
         if(month > 12){
           year++;
           month = 1;
         }
         
         return [day, month, year];
     }
     
     var buildString = function(d){
       if(exists(d[0], d[1], d[2])){
         return d[0]+" "+months[d[1]]+" "+d[2];
       }else{
         return "";
       }
     }
     
     if(EPFL.getPage().length == 2 && EPFL.getPage()[0] == "Notebook"){
       var date = EPFL.getPage()[1];
       
       var parts = EPFL.dateRegex.exec(date);
       if(parts != null){
         var day = parseInt(parts[1], 10);
         var month = 6;
         for(var i = 1; i < 12; i++){
           if(months[i] == parts[2]){
             month = i;
           }
         }
         var year = parseInt(parts[3], 10);
         
         var prevDate = getCorrectDate(day-1, month, year);
         while(prevDate[2] == 2012 && !exists(prevDate[0], prevDate[1], prevDate[2])){
           prevDate = getCorrectDate(prevDate[0]-1, prevDate[1], prevDate[2]);
         }
         
         var nextDate = getCorrectDate(day+1, month, year);
         while(nextDate[2] == 2012 && !exists(nextDate[0], nextDate[1], nextDate[2])){
           nextDate = getCorrectDate(nextDate[0]+1, nextDate[1], nextDate[2]);
         }
         var prev = buildString(prevDate);
         var next = buildString(nextDate);
         
         $(".page-content").prepend(
$("
")
             .css({"clear": "both"}));
         
         if(prev.length > 0){
           $(".page-content").prepend(
             $("<a>")
               .css({"float": "left"})
               .attr("href", "/Team:EPF-Lausanne/Notebook/"+prev)
               .html("\u2190 "+prev));
         }
         
         if(next.length > 0){
           $(".page-content").prepend(
             $("<a>")
               .css({"float": "right"})
               .attr("href", "/Team:EPF-Lausanne/Notebook/"+next)
               .html(next+" \u2192"));
         }
       }
     }
   },
   setupPlanning: function(){
     if(EPFL.getPage()[0] == "Planning"){
       $(".toctext, .mw-headline").each(function(){
         var text = $(this).text().trim();
         
         if(text.substr(0, 1) == "\u2713"){
           $(this).addClass("planning-finished");
         }else{
           var parts = text.split(" - ");
           if(parts.length == 1){
             $(this).addClass("planning-todo");
           }else{
             $(this).addClass("planning-taken");
           }
         }
       });
     }
   },
   setupProtocols: function(){
     var hide = false;
     $(".protocol-title").each(function(){
       if($.trim($(this).parent().parent().attr("class")) != "protocol-remove-style"){
         hide = true;
         var link = $("<a>")
           .attr("href", "#")
           .click(
             function(){
               $(this).parent().parent().children().last().toggle()
               return false;
           });
         
         var children = $(this).children().children();
         $(this).empty();
         link.append(children);
         $(this).append(link);
       }else{
         var txt = $(this).text();
         $(this).empty();
         $(this).text(txt);
       }
     });
     if(hide)
       $(".protocol-inner-box").hide();
   },
   setupCalendar: function(){
     if(EPFL.getPage().length == 1 && EPFL.getPage()[0] == "Notebook"){
       var toAdd = amp+"preload=Team:EPF-Lausanne/Notebook/Template/NewEntry";
         $(".month tr td a")
           .filter(
             function(){ 
               return $(this).attr("href").length > 80;
             })
           .each(
             function(){
               $(this).attr("href", $(this).attr("href")+toAdd);
             }
           );
     }
   },
   setupTitle: function(){
     var title = "";
     if(window.titleOverride !== undefined && window.titleOverride !== "" && window.titleOverride !== " " && window.titleOverride !== "{{{1}}}"){
       title = window.titleOverride;
     }else{
       var title = $($(".firstHeading")[0]).text();
       var prefix = "Team:EPF-Lausanne/";
       title = title.substr(prefix.length);
       titleParts = title.split("/");
       
       switch(titleParts[0]){
         case "Template":
           titleParts.shift();
           break;
       }
       
       var result = titleParts.join(" ");
       
       if(titleParts.length > 1){
         result = titleParts.shift()+": "+titleParts.join(" ");
       }
       
       if(result == ""){
         result = "Home";
       }
       title = result;
     }
     
     $("#pageTitle").text(title);
   }
 };

}());

if(!window.console){

 //Dummy console...
 window.console = {
   log: function(){ }
 };

}

window.Doodles = (function(){

 var SPACE_MIN = 80;
 var SPACE_MAX = 400;
 var WIDTH = 120;
 var MAX_DOODLES_PER_BAR = 100;
 var MAX_RETRIES = 100;
 
 var all = [
   //{ height: 114, src: "Team-EPF-Lausanne_Template_Doodle_Placeholder.png" },
   { height: 27, src: "Team-EPF-Lausanne_Doodle_Switch.png" },
   { height: 131, src: "Team-EPF-Lausanne_Doodle_Graph.png" },
   { height: 87, src: "Team-EPF-Lausanne_Doodle_Circuit.png" },
   { height: 138, src: "Team-EPF-Lausanne_Doodle_Centrifuge.png" },
   { height: 76, src: "Team-EPF-Lausanne_Doodle_Agarose.png" },
 
 
   { height: 156, src: "LED.png" },
   { height: 175, src: "Pipette.png" },
   { height: 141, src: "Team_epf_Resistance.png" },
   { height: 71, src: "Team_epf_Restrictionenzyme.png" },
   { height: 128, src: "Team_epf_Wellplate.png" },
   { height: 98, src: "Team_epf_Plasmid.png" }
 
 ];
 
 var isHomePage = function(){
   var title = $($(".firstHeading")[0]).text();
   var prefix = "Team:EPF-Lausanne/";
   title = title.substr(prefix.length);
   titleParts = title.split("/");
   
   switch(titleParts[0]){
     case "Template":
       titleParts.shift();
       break;
   }
   
   var result = titleParts.join(" ");
   
   if(result == ""){
     return true;
   }
   return false;
 }
 
 var contentHeight = 0;
 var doodleBars = [];
 var barUsage = [{max: 0, images: []}, {max: 0, images: []}];
 var previous = undefined;
 var firstLoad = true;
 
 return {
   onLoad: function(){
     if(firstLoad){
       var that = this;
       setTimeout(function(){ that.onLoad(); }, 1000);
       firstLoad = false;
     }
     
     //console.log("Doodle onload");
     contentHeight = $(".page-content").height() - 50;
     doodleBars = $(".doodle-bar");
     //doodleBars.height(contentHeight);
     
     this.addDoodles();
   },
   addDoodles: function(){
     //console.log("Adding doodles to left");
     
     if(isHomePage()){
       this.addDoodle(1, 400);
     }
     
     //Add a doodle at one of the sides (random) at y = 0
     this.addDoodle(Math.round(Math.random()), 0);
     
     for(var i = 0; i < MAX_DOODLES_PER_BAR; i++){
       if(!this.addDoodle(0)) break;
     }
     
     //console.log("Adding doodles to right");
     for(var i = 0; i < MAX_DOODLES_PER_BAR; i++){
       if(!this.addDoodle(1)) break;
     }
   },
   addDoodle: function(barNumber, nextDistance){
     //console.log("Trying to add doodle to", barNumber);
     var bar = $(doodleBars[barNumber]);
     var usage = barUsage[barNumber];
     
     //console.log("Current usage vs contentHeight: ", usage.max, contentHeight);
     if(usage.max > contentHeight) return false;
     
     if(nextDistance === undefined)
       nextDistance = SPACE_MIN + Math.floor(Math.random()*(SPACE_MAX-SPACE_MIN+1));
     
     var nextImage = all[Math.floor(Math.random()*all.length)];
     for(var i = 0; i < MAX_RETRIES; i++){
       if(previous == nextImage){
         nextImage = all[Math.floor(Math.random()*all.length)];
       }else{
         break;
       }
     }
     
     if(previous == nextImage) return false;
     
     previous = nextImage;
     
     if(usage.max + nextDistance + nextImage.height > contentHeight) return false;
     
var container = $("
")
         .css({
           "background": "url('"+nextImage.src+"')",
           "width": WIDTH+"px",
           "height": nextImage.height+"px",
           "margin-top": nextDistance+"px"
         });
     bar.append(container);
     /*
     var img = 
       $("<img>")
         .load(function(){ container.append(img); })
         .attr("width", WIDTH)
         .attr("height", nextImage.height)
         .attr("src", nextImage.src);*/
     
     usage.max += nextDistance + nextImage.height;
     
     return true;
   }
 };

})();

window.Menu = (function(){

 var items = ["introduction", "project", "notebook", "human", "acknowledgments"];
 var positions = {"introduction": -300, "project": -170, "notebook": -60, "human": 75, "acknowledgments": 240};
 
 var subMenus = {
   introduction: [
     ["Home", "/Team:EPF-Lausanne"],
     ["Team", "/Team:EPF-Lausanne/Team"],
     ["Photos", "/Team:EPF-Lausanne/Photos"]
   ],
   project: [
     ["Project Contents", "/Team:EPF-Lausanne/Project"],
     ["Results", "/Team:EPF-Lausanne/Results"],
     ["Parts Submitted to the Registry", "https://2012.igem.org/Team:EPF-Lausanne/Parts"],
     ["Modeling", "/Team:EPF-Lausanne/Modeling"]
   ],
   notebook: [
     ["Notebook", "/Team:EPF-Lausanne/Notebook"],
     ["Protocols", "/Team:EPF-Lausanne/Protocol"]
   ],
   human: [
     ["Talks", "/Team:EPF-Lausanne/Human/Talks"],
     ["Survey", "/Team:EPF-Lausanne/Human/Survey"],
     ["Primer Design", "/Team:EPF-Lausanne/PrimerDesignHelper"],
     ["Cell Creator", "/Team:EPF-Lausanne/CellCreator"],
     ["Safety", "/Team:EPF-Lausanne/Safety"],
   ],
   acknowledgments: [
     ["Attributions", "/Team:EPF-Lausanne/Acknowledgments"],
     ["References", "/Team:EPF-Lausanne/References"],
     ["Sponsors", "/Team:EPF-Lausanne/Sponsors"]
   ]
 };
 
 // Default to notebook
 var current = "notebook";
 var leaveTimer = undefined;
 var leaveMenu = function(){
   current = window.menu != "" ? window.menu.toLowerCase() : "notebook";
   window.Menu.update();
 };
 var attachEvents = function(name){
   $(".menu-"+name).mouseover(function(){
     if(leaveTimer !== undefined){
       clearTimeout(leaveTimer);
       leaveTimer = undefined;
     }
     current = name;
     window.Menu.update();
   });
   $(".menu-"+name).mouseout(function(){
     if(leaveTimer === undefined){
       leaveTimer = setTimeout(leaveMenu, 1000);
     }
   });
 };
 return {
   onLoad: function(){
     // Default to notebook
     if(window.menu === undefined || window.menu === "" || window.menu === " " || window.menu === "{{{1}}}"){
       window.menu = "notebook";
     }
     current = window.menu != "" ? window.menu.toLowerCase() : "notebook";
     
     for(var i = 0; i < items.length; i++){
       attachEvents(items[i]);
     }
     
     $(".sub-menu").mouseover(function(){
       if(leaveTimer !== undefined){
         clearTimeout(leaveTimer);
         leaveTimer = undefined;
       }
     });
     
     $(".sub-menu").mouseout(function(){
       if(leaveTimer === undefined){
         leaveTimer = setTimeout(leaveMenu, 1000);
       }
     });
     
     $(".paper-arrow").show();
     window.Menu.update();
   },
   update: function(){
     if(current === undefined || current === "" || current === " "|| current === "{{{1}}}" || !positions[current]){
       $(".paper-arrow").hide();
     }else{
       $(".paper-arrow").show();
       var newPos = positions[current]+"px";
       $(".paper-arrow").css({left: newPos});
     }
     this.updateSubMenu();
   },
   updateSubMenu: function(){
     var subMenu = subMenus[current];
     
     var sub = $(".sub-menu .simple-navi ul");
     sub.empty();
     
     if(subMenu !== undefined && subMenu.length > 0){
sub.append($("
  • ").attr("class", "left").append($(""))); for(var i = 0; i < subMenu.length; i++){ sub.append($("
  • ") .append($("<a>") .attr("href", subMenu[i][1]) .append($("").text(subMenu[i][0])))); } sub.append($("
  • ").attr("class", "right").append($(""))); var center = positions[current]; width = sub.width(); var x = 330 + center - width/2; var dx = 0; if(width > 660){ dx = -center; }else if(x < -40){ dx = -x - 40; }else if(x + width > 660){ dx = 660 - width - x; } sub.css({"position": "relative", "left": (center+dx)+"px"}); } } }; })(); $(function(){ Menu.onLoad(); Doodles.onLoad(); }); runOnloadHook = function(){ EPFL.setup(); };