Team:Cambridge/static/wiki.js
From 2011.igem.org
/*
This file is part of the cambridge 2011 igem teams wiki. nothing is guaranteed.
DO WHAT THE F*CK YOU WANT TO PUBLIC LICENSE Version 2, December 2004
Copyright (C) 2011 Haydn King hjking734@gmail.com
Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed.
DO WHAT THE F*CK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE F*CK YOU WANT TO.
- /
//current area/subarea var area = 'overview'; var subarea = 'home'; //the url that's loaded var the_url = window.location.pathname;//the url that's being displayed //the interval var int;
var set_hash = function(path) {//set the hash to the path given
int = window.clearInterval(int); //turn the path into a presentable hash var hash = path.replace(/http:\/\/2011.igem.org/i, ).replace(/\/Team:Cambridge/i, ); window.location.hash = hash; the_url = get_hash(false); int = setInterval('check_hash();', 500);
}
var get_hash = function(absolute) {
var hash = window.location.hash.substr(1); if(!absolute || (absolute == undefined)) return "/Team:Cambridge" + hash; return "https://2011.igem.org/Team:Cambridge" + hash;
}
var check_hash = function() {//check if the hash has changed (e.g. back button press)
if(the_url != get_hash(false)) { int = clearInterval(int);//pause if((window.location.hash.charAt(1) == '/') || (window.location.hash == )) load_url(get_hash(false)); int = setInterval('check_hash();', 500); }
}
//update the edit, login and logout links after page change var update_links = function(current_url) {
$('#edit-link').attr('href', current_url + '?action=edit'); $('#edit-intro-link').attr('href', '/Team:Cambridge/desc/' + area + '/' + subarea + '?action=edit'); $('#login-link' ).attr('href', '/wiki/index.php?title=Special:UserLogin&returnto=' + current_url); $('#logout-link').attr('href', '/wiki/index.php?title=Special:UserLogout&returnto=' + current_url);
}
var is_internal = function(obj) {
if($(obj).hasClass('cam-external')) return false; return /\/Team:Cambridge/i.test($(obj).attr("href"));
} var is_external = function(obj) { return !is_internal(obj);}
var areas = [
[/\/Team:Cambridge\/project/i, 'project',], [/\/Team:Cambridge\/(experiments|constructs|protocols|safety|labwork)/i, 'labwork',], [/\/Team:Cambridge\/society/i, 'society',], [/\/Team:Cambridge\/team/i, 'team',], [/\/Team:Cambridge/i, 'overview'], [/./i, 'overview'],
];
var subareas = {
'overview': [ [/\/Team:Cambridge\/Media/i, 'media'], [/\/Team:Cambridge\/Parts/i, 'parts'], [/\/Team:Cambridge\/Blog/i, 'blog'], [/./i, 'home'],
],
'project': [ [/\/Team:Cambridge\/Project\/Background/i, 'background'], [/\/Team:Cambridge\/Project\/Microscopy/i, 'microscopy'], [/\/Team:Cambridge\/Project\/in_vitro/i, 'invitro'], [/\/Team:Cambridge\/Project\/in_vivo/i, 'invivo'], [/\/Team:Cambridge\/Project\/gibthon/i, 'gibthon'], [/\/Team:Cambridge\/Project\/future/i, 'future'], [/\/Team:Cambridge\/Project/i, 'overview'],
],
'labwork': [ [/\/Team:Cambridge\/Experiments\/Plasmid_Constructs/i, 'constructs'], [/\/Team:Cambridge\/experiments/i, 'experiments'], [/\/Team:Cambridge\/protocols/i, 'protocols'], [/\/Team:Cambridge\/safety/i, 'safety'], [/\/Team:Cambridge\/labwork/i, 'overview'],
],
'society': [ [/\/Team:Cambridge\/Society\/report/i, 'report'], [/\/Team:Cambridge\/Society\/interviews/i, 'interviews'], [/\/Team:Cambridge\/Society/i, 'overview'],
],
'team': [ [/\/Team:Cambridge\/Team\/Students/i, 'students'], [/\/Team:Cambridge\/Team\/Academics/i, 'academics'], [/\/Team:Cambridge\/Team\/Sponsors/i, 'sponsors'], [/\/Team:Cambridge\/Team/i, 'overview'],
], };
var get_main_area = function(path) {
for ( var a in areas)
{ if(areas[a][0].test(path)) { return areas[a][1]; } }
return 'default';
}
var get_sub_area = function(path, area) {
if(area == 'default') return 'default'; for ( var a in subareas[area])
{ if(subareas[area][a][0].test(path)) { return subareas[area][a][1]; } }
return 'overview';
}
var get_area = function(path) { //figure out which area of the site we are in
if(path == undefined)
var path = location.pathname; var ar = get_main_area(path); var sub = get_sub_area(path, ar); return [ar, sub]; }
var apply_area = function() { $('.cam-selected').removeClass('cam-selected'); $('.cam-menu-item.cam-' + area).addClass('cam-selected'); $('.cam-' + area + '-' + subarea).addClass('cam-selected'); }
var set_area = function(path) { var as = get_area(path); area = as[0]; subarea = as[1]; apply_area(); }
var colorize_links = function($container) //colourise all the links in the container based on where the go {
$container.find('a').each( function(i) { var $this = $(this); if($this.hasClass('cam-color-exempt')) return; var ar = ; if(is_external($this)) ar = 'ext'; else ar = get_main_area($this.attr('href')); $(this).addClass('cam-' + ar); });
}
var loading_timeout;
var show_loading = function() {
//only show the loading bar if it's taking more than 500ms to display loading_timeout = setTimeout("$('#cam_loading').slideDown('fast');", 500);
}
var hide_loading = function() {
clearTimeout(loading_timeout); $('#cam_loading').slideUp('fast');
}
var load_url = function(url) {
if(url == undefined) url = '/Team:Cambridge';
var after_hash = ; var match = url.match(/#.+/i); if(match != null) after_hash = match[0].substr(1); var hash_start = url.search('#'); if(hash_start > 0) { url = url.substr(0, hash_start); } var load = url + '?action=render';
show_loading(); $.ajax({ 'url': load, 'dataType': 'html', 'error': function(jqXHR, textStatus, errorThrown) { hide_loading(); set_hash(url);var $c = $('
AjaxError
Got error "' + errorThrown + '" while attempting to load url "' + load + '"
');$('#cam_pagecontent').hide().html($c).show(); window.scrollTo(0,0); }, 'success': function(data){ var $c = $('#wiki_content', data); $('#cam_pagecontent').hide().html($c.html()).show(); colorize_links($('#cam_pagecontent')); window.scrollTo(0,0); hide_loading(); if(after_hash != ) window.location.hash = after_hash; set_hash(url); //load the parts if we're on the parts page. This is hacky but I don't give a fark if((area == 'overview') && (subarea == 'parts')) { $('#groupparts').load('/cgi/api/groupparts.cgi?t=iGEM011\&g=Cambridge',function(){ $('#groupparts .tablesorter').tablesorter();} ); } }, }); set_area(url); $('#cam_desc').introduction('setArea', area, subarea); update_links(url);
};
var wiki_main = function() {
$('.cam-menu-item a').mouseenter( function(event) {//in
$(event.currentTarget).next().children('.cam-menu-drop').slideDown('fast');
}); $('.cam-menu-item').mouseleave( function(event) {//out $(event.currentTarget).find('.cam-menu-drop').slideUp('fast'); }).click( function(event) {//hide on click $(event.currentTarget).find('.cam-menu-drop').slideUp('fast'); });
$('.cam-social-link').hover( function(event) { $(this).children().animate({top:0}, 75); }, function(event) { $(this).children().animate({'top':12}, 250); } ).click( function() { window.location = $(this).attr('href'); });
$('a').live('click', function(event) { if(event.ctrlKey) return true; if(is_internal(this)) { event.preventDefault(); load_url($(this).attr('href')); return false; } return true; });
$('#cam_topbar a').hover( function() { $(this).prev('.cam-ui-icon').addClass('cam-hover'); }, function() { $(this).prev('.cam-ui-icon').removeClass('cam-hover'); } );
int = window.setInterval('check_hash();', 500); if((window.location.hash == ) || (window.location.hash == undefined) || !(window.location.hash.charAt(1) == '/')) { set_area(the_url); set_hash(the_url); update_links(the_url); colorize_links($('#wiki_content')); $('#cam_desc').introduction('setArea', area, subarea); } else { load_url(get_hash()); }
}