Team:EPF Lausanne/template/script.js

From 2013.igem.org

(Difference between revisions)
 
(25 intermediate revisions not shown)
Line 8: Line 8:
       EPFL.setupTOC();
       EPFL.setupTOC();
       EPFL.startTaxi();
       EPFL.startTaxi();
 +
      EPFL.setupNotebookNavButtons();
 +
      EPFL.setupImageRows();
 +
      EPFL.setupImageSwap();
       $('p')
       $('p')
         .filter(function(){
         .filter(function(){
Line 14: Line 17:
         .remove();
         .remove();
     },
     },
 +
    dateRegex: /^([0-9]+) ([A-Z][a-z]+) ([0-9]+)$/,
     onLoad: function() {
     onLoad: function() {
-
       $(".main-item").on
+
        
 +
    },
 +
    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;
 +
    },
 +
    setupImageSwap: function(){
 +
      $(".image-swap").each(function() {
 +
        var obj = $(this);
 +
        var img1 = $($("img", obj)[0]);
 +
        var img2 = $($("img", obj)[1]);
 +
       
 +
        img2.hide();
 +
        obj.mouseenter(function() {
 +
          img1.hide();
 +
          img2.show();
 +
        });
 +
        obj.mouseleave(function() {
 +
          img2.hide();
 +
          img1.show();
 +
        });
 +
      });
 +
    },
 +
    setupImageRows: function(){
 +
      $(".image-row").each(function() {
 +
        var obj = $(this);
 +
        EPFL.setupImageRow(obj);
 +
      });
 +
    },
 +
    setupImageRow: function(row){
 +
      var obj = $(row);
 +
     
 +
      if (obj.hasClass("image-row-loaded")) {
 +
        return;
 +
      }
 +
     
 +
      obj.css({
 +
        width: "100%",
 +
        position: "relative"
 +
      });
 +
     
 +
      var width = obj.width();
 +
     
 +
      var images = $("img", obj);
 +
     
 +
      var MARGIN = 10;
 +
     
 +
      var total = 0;
 +
      var n = 0;
 +
      var allLoaded = true;
 +
      images.each(function() {
 +
        $(this).load(function() {
 +
          EPFL.setupImageRow(row);
 +
        });
 +
        var h = $(this).height();
 +
        var w = $(this).width();
 +
       
 +
        if (isNaN(w)) {
 +
          allLoaded = false;
 +
        }
 +
        total += w/h;
 +
        n++;
 +
      });
 +
     
 +
      var height = Math.floor((width - (n-1)*MARGIN)/ total);
 +
     
 +
      if (!isNaN(height) && allLoaded) {
 +
        var x = 0;
 +
        images.each(function() {
 +
          var w = $(this).width();
 +
          var h = $(this).height();
 +
         
 +
          var lWidth = Math.floor(w / h * height);
 +
          var lHeight = Math.floor(lWidth * w / h);
 +
          $(this).css({
 +
            position: "absolute",
 +
            left: x+"px",
 +
            width: lWidth+"px",
 +
            height: height+"px"
 +
          });
 +
          x += lWidth;
 +
          x += MARGIN;
 +
        });
 +
       
 +
        row.css({height: height+"px"});
 +
       
 +
        obj.addClass("image-row-loaded");
 +
      }
 +
    },
 +
    setupNotebookNavButtons: function(){
 +
      var months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
 +
      //Note: Valid for 2013, if you're reusing this script, update this:
 +
      var days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
 +
     
 +
      var exists = function(day, month, year){
 +
        return year == 2013 && month >= 7 && month <= 11;
 +
      };
 +
     
 +
      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] == "Calendar"){
 +
        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] == 2013 && !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] == 2013 && !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(
 +
            $("<div>")
 +
              .css({"clear": "both"}));
 +
         
 +
          if(prev.length > 0){
 +
            $(".page-content").prepend(
 +
              $("<a>")
 +
                .css({"float": "left"})
 +
                .attr("href", "/Team:EPF_Lausanne/Calendar/"+prev)
 +
                .html("\u2190 "+prev));
 +
          }
 +
         
 +
          if(next.length > 0){
 +
            $(".page-content").prepend(
 +
              $("<a>")
 +
                .css({"float": "right"})
 +
                .attr("href", "/Team:EPF_Lausanne/Calendar/"+next)
 +
                .html(next+" \u2192"));
 +
          }
 +
        }
 +
      }
     },
     },
     setupTOC: function(){
     setupTOC: function(){
Line 73: Line 257:
       current.addClass("menu-item-selected");
       current.addClass("menu-item-selected");
        
        
-
       window.onresize = function() {
+
       $(window).resize(function() {
         resizedWindow = true;
         resizedWindow = true;
         gotoMenuItem(current);
         gotoMenuItem(current);
-
       };
+
       });
        
        
       var returnTimeout = null;
       var returnTimeout = null;
       var gotoMenuItem = function(item, returningToBase) {
       var gotoMenuItem = function(item, returningToBase) {
-
         if (!returningToBase && current[0] == item[0]){
+
         if (!resizedWindow && !returningToBase && current[0] == item[0]){
           current.removeClass("menu-item-selected");
           current.removeClass("menu-item-selected");
           current = item;
           current = item;
Line 89: Line 273:
         }
         }
         if (!resizedWindow && currentTarget != null && item[0] == currentTarget[0]) return;
         if (!resizedWindow && currentTarget != null && item[0] == currentTarget[0]) return;
-
        console.log("Vroom!");
 
         current.removeClass("menu-item-selected");
         current.removeClass("menu-item-selected");
         current = item;
         current = item;

Latest revision as of 13:36, 3 October 2013

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

 //Little hack to stop MediaWiki from replacing ampersands...
 var amp = unescape("%26");
 return {
   init: function(){
     EPFL.setupTitle();
     EPFL.setupTOC();
     EPFL.startTaxi();
     EPFL.setupNotebookNavButtons();
     EPFL.setupImageRows();
     EPFL.setupImageSwap();
     $('p')
       .filter(function(){
         return $.trim($(this).text()) ===  && $.trim($(this).html()).length < 10;
       })
       .remove();
   },
   dateRegex: /^([0-9]+) ([A-Z][a-z]+) ([0-9]+)$/,
   onLoad: function() {
     
   },
   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;
   },
   setupImageSwap: function(){
     $(".image-swap").each(function() {
       var obj = $(this);
       var img1 = $($("img", obj)[0]);
       var img2 = $($("img", obj)[1]);
       
       img2.hide();
       obj.mouseenter(function() {
         img1.hide();
         img2.show();
       });
       obj.mouseleave(function() {
         img2.hide();
         img1.show();
       });
     });
   },
   setupImageRows: function(){
     $(".image-row").each(function() {
       var obj = $(this);
       EPFL.setupImageRow(obj);
     });
   },
   setupImageRow: function(row){
     var obj = $(row);
     
     if (obj.hasClass("image-row-loaded")) {
       return;
     }
     
     obj.css({
       width: "100%",
       position: "relative"
     });
     
     var width = obj.width();
     
     var images = $("img", obj);
     
     var MARGIN = 10;
     
     var total = 0;
     var n = 0;
     var allLoaded = true;
     images.each(function() {
       $(this).load(function() {
         EPFL.setupImageRow(row);
       });
       var h = $(this).height();
       var w = $(this).width();
       
       if (isNaN(w)) {
         allLoaded = false;
       }
       total += w/h;
       n++;
     });
     
     var height = Math.floor((width - (n-1)*MARGIN)/ total);
     
     if (!isNaN(height) && allLoaded) {
       var x = 0;
       images.each(function() {
         var w = $(this).width();
         var h = $(this).height();
         
         var lWidth = Math.floor(w / h * height);
         var lHeight = Math.floor(lWidth * w / h);
         $(this).css({
           position: "absolute",
           left: x+"px",
           width: lWidth+"px",
           height: height+"px"
         });
         x += lWidth;
         x += MARGIN;
       });
       
       row.css({height: height+"px"});
       
       obj.addClass("image-row-loaded");
     }
   },
   setupNotebookNavButtons: function(){
     var months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
     //Note: Valid for 2013, if you're reusing this script, update this:
     var days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
     
     var exists = function(day, month, year){
       return year == 2013 && month >= 7 && month <= 11;
     };
     
     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] == "Calendar"){
       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] == 2013 && !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] == 2013 && !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/Calendar/"+prev)
               .html("\u2190 "+prev));
         }
         
         if(next.length > 0){
           $(".page-content").prepend(
             $("<a>")
               .css({"float": "right"})
               .attr("href", "/Team:EPF_Lausanne/Calendar/"+next)
               .html(next+" \u2192"));
         }
       }
     }
   },
   setupTOC: function(){
     var toc = $("#toc");
     toc.remove();
     $(".paper").prepend(toc);
   },
   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);
   },
   startTaxi: function() {
     var taxi = $("#taxi");
     var menu = $($("nav")[0]);
     
     var DURATION = 400;
     var FLIP_DURATION = 200;
     var EASING = "swing";
     var DELAY = 800;
     var OFFSET = 30;
     var animate = true;
     
     $("#taxi").css({perspective: "400px"});
     
     var base = $(menu.find(".menu-item")[0]);
     var current = $(menu.find(".menu-item")[0]);
     var currentTarget = null;
     var facingRight = true;
     var resizedWindow = false;
     
     current.addClass("menu-item-selected");
     
     $(window).resize(function() {
       resizedWindow = true;
       gotoMenuItem(current);
     });
     
     var returnTimeout = null;
     var gotoMenuItem = function(item, returningToBase) {
       if (!resizedWindow && !returningToBase && current[0] == item[0]){
         current.removeClass("menu-item-selected");
         current = item;
         if(!returningToBase) {
           item.addClass("menu-item-selected");
         }
         return;
       }
       if (!resizedWindow && currentTarget != null && item[0] == currentTarget[0]) return;
       current.removeClass("menu-item-selected");
       current = item;
       if(!returningToBase) {
         current.addClass("menu-item-selected");
       }
       var currentPosition = $("#taxi").position().left;
       var menuItemPosition = item.position().left;
       
       var targetPosition = menuItemPosition + OFFSET;
       
       var flipNeeded = !facingRight;
       var flipCSS = {transform: "scale(1,1)",
         "-webkit-transform": "scale(1,1)",
         "-moz-transform": "scale(1,1)",
         "-ms-transform": "scale(1,1)",
         "-o-transform": "scale(1,1)",
         filter: "none"};
       var flipCSS_anim = 0;
       var willBeFacingRight = true;
       if(currentPosition > targetPosition) {
         flipCSS = {transform: "scale(-1,1)",
           "-webkit-transform": "scale(-1,1)",
           "-moz-transform": "scale(-1,1)",
           "-ms-transform": "scale(-1,1)",
           "-o-transform": "scale(-1,1)",
           filter: "fliph"};
         flipCSS_anim = 180;
         flipNeeded = facingRight;
         willBeFacingRight = false;
       }
       
       facingRight = willBeFacingRight;
       
       resizedWindow = false;
       if (animate) {
         $("#taxi").stop(true, false);
         currentTarget = item;
         if (flipNeeded) {
           $("#taxi").animate({"text-indent": flipCSS_anim}, {
             duration: FLIP_DURATION,
             easing: EASING,
             complete: function(){
             $("#taxi").css(flipCSS);
             }, step: function(now,fx) {
               $(this).css({transform: "rotateY( "+now+"deg )",
                 "-webkit-transform": "rotateY( "+now+"deg )",
                 "-moz-transform": "rotateY( "+now+"deg )",
                 "-ms-transform": "rotateY( "+now+"deg )",
                 "-o-transform": "rotateY( "+now+"deg )",
                 filter: "none"}); 
             }
           });
         } else {
           $("#taxi").css(flipCSS);
         }
         $("#taxi").animate({left: targetPosition+"px"}, {
           duration: DURATION,
           easing: EASING,
           complete: function() {
             currentTarget = null;
           }
         });
       } else {
         $("#taxi").css(flipCSS);
         $("#taxi").css({left: targetPosition+"px"});
       }
     };
     var returnToBase = function() {
       gotoMenuItem(base, true);
       returnTimeout = null;
     }
     
     $(".menu-item").mouseover(function() {
       var obj = $(this);
       
       while(obj[0] != undefined && obj[0].tagName.toLowerCase() != "div") {
         obj = obj.parent();
       }
       
       if(!obj.hasClass("menu-item")) return;
       
       if(returnTimeout != null) {
         clearTimeout(returnTimeout);
         returnTimeout = null;
       }
       
       gotoMenuItem(obj);
     }).mouseout(function() {
       if(!$(this).hasClass("menu-item")) return;
       
       if(returnTimeout == null) {
         returnTimeout = setTimeout(returnToBase, DELAY);
       }
     });
     animate = false;
     returnToBase();
     animate = true;
   }
 };

}()); /* if(!window.console){

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

}*/

$(function(){

 EPFL.onLoad();

});

var oldRunOnloadHook = runOnloadHook; runOnloadHook = function(){

 EPFL.init();
 if (oldRunOnloadHook) oldRunOnloadHook();
};