Team:Queens-Canada/js/favicon

From 2010.igem.org

// Favicon.js - Change favicon dynamically [http://ajaxify.com/run/favicon]. // Copyright (c) 2006 Michael Mahemoff. Only works in Firefox and Opera. // Background and MIT License notice at end of file, see the homepage for more.

// USAGE: // * favicon.change("/icon/active.ico"); (Optional 2nd arg is new title.) // * favicon.animate(new Array("icon1.ico", "icon2.ico", ...)); // Tip: Use "" as the last element to make an empty icon between cycles. // To stop the animation, call change() and pass in the new arg. // (Optional 2nd arg is animation pause in millis, overwrites the default.) // * favicon.defaultPause = 5000;

var favicon = {

// -- "PUBLIC" ----------------------------------------------------------------

defaultPause: 2000,

change: function(iconURL, optionalDocTitle) {

 clearTimeout(this.loopTimer);
 if (optionalDocTitle) {
   document.title = optionalDocTitle;
 }
 this.addLink(iconURL, true);

},

animate: function(iconSequence, optionalDelay) {

 this.preloadIcons(iconSequence);
 this.iconSequence = iconSequence;
 this.sequencePause = (optionalDelay) ?  optionalDelay : this.defaultPause;
 favicon.index = 0;
 favicon.change(iconSequence[0]);
 this.loopTimer = setInterval(function() {
   favicon.index = (favicon.index+1) % favicon.iconSequence.length;
   favicon.addLink(favicon.iconSequence[favicon.index], false);
 }, favicon.sequencePause);

},

// -- "PRIVATE" ---------------------------------------------------------------

loopTimer: null,

preloadIcons: function(iconSequence) {

 var dummyImageForPreloading = document.createElement("img");
 for (var i=0; i<iconSequence.length; i++) {
   dummyImageForPreloading.src = iconSequence[i];
 }

},

addLink: function(iconURL) {

 var link = document.createElement("link");
 link.type = "image/x-icon";
 link.rel = "shortcut icon";
 link.href = iconURL;
 this.removeLinkIfExists();
 this.docHead.appendChild(link);

},

removeLinkIfExists: function() {

 var links = this.docHead.getElementsByTagName("link");
 for (var i=0; i<links.length; i++) {
   var link = links[i];
   if (link.type=="image/x-icon" && link.rel=="shortcut icon") {
     this.docHead.removeChild(link);
     return; // Assuming only one match at most.
   }
 }

},

docHead:document.getElementsByTagName("head")[0] }

// BACKGROUND // The main point of this script is to give you a means of alerting the user // something has happened while your application is in a background tab. Serves // a similar task to notifications in the operating system taskbar. A secondary // function is to support favicon animation. // // This script works by DOM manipulation. After a call, there will be exactly one // "rel='icon'" link and one "rel='shortcut icon'" link under the head element. // Both of these are required for portability reasons. It would be nice (from // a performance perspective) if we could just update an existing link, if it // already exists, but it turns out we can't. Firefox (and others?) will ignore // changes to the link's attributes; it's only interested in a new link being // added. So we have to delete and re-add in all cases.

// LEGAL // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE.