/* Pushup * Copyright (c) 2008 Nick Stakenburg (www.nickstakenburg.com) * * License: MIT-style license. * Website: http://www.pushuptheweb.com * */ var Pushup = { Version: '1.0.3', options: { appearDelay: .5, fadeDelay: 6, images: '../images/pushup/', message: 'Important browser update available', reminder: { hours: 6, message: 'Remind me again in #{hours}' }, skip: true }, updateLinks: { IE: 'http://www.microsoft.com/windows/downloads/ie/', Firefox: 'http://www.getfirefox.com', Safari: 'http://www.apple.com/safari/download/', Opera: 'http://www.opera.com/download/' }, Browser: { IE: !!(window.attachEvent && navigator.userAgent.indexOf('Opera') === -1), Firefox: navigator.userAgent.indexOf('Firefox') > -1, Safari: navigator.userAgent.indexOf('AppleWebKit/') > -1 && /Apple/.test(navigator.vendor), Opera: navigator.userAgent.indexOf('Opera') > -1 } }; Pushup.conditions = { IE: (function(agent) { var version = /MSIE ([\d.]+)/.exec(agent); return version && parseFloat(version[1]) < 7; })(navigator.userAgent), Firefox: Pushup.Browser.Firefox && parseFloat(navigator.userAgent.match(/Firefox[\/\s](\d+)/)[1]) < 3, Safari: Pushup.Browser.Safari && parseFloat(navigator.userAgent.match(/AppleWebKit\/(\d+)/)[1]) < 500, Opera: Pushup.Browser.Opera && (!window.opera.version || parseFloat(window.opera.version()) < 9.5) }; (function() { // find current browser and check if it needs an update for (var browser in Pushup.Browser) if (Pushup.Browser[browser]) Pushup._browserUsed = browser; Pushup._updateBrowser = Pushup.conditions[Pushup._browserUsed] && Pushup._browserUsed; // stop if no update is required and we want to skip build if (!Pushup._updateBrowser && Pushup.options.skip) return; function Extend(destination, source) { for (var property in source) destination[property] = source[property]; return destination; } Extend(Pushup, { start: function() { // get the image directory if (/^(https?:\/\/|\/)/.test(this.options.images)) this.images = this.options.images; else { var srcMatch = /pushup(?:-[\w\d.]+)?\.js(.*)/, scripts = document.getElementsByTagName('script'); for (var i = 0, l = scripts.length; i < l; i++) { var s = scripts[i]; if (s.src && s.src.match(srcMatch)) this.images = s.src.replace(srcMatch, '') + this.options.images; } } if (Pushup._updateBrowser) this.show(); }, build: function() { this.pushup = document.createElement('div'); Opacity.set(this.pushup, 0); this.pushup.id = 'pushup'; this.messageLink = this.pushup.appendChild(document.createElement('a')); this.messageLink.className = 'pushup_messageLink'; this.messageLink.target = '_blank'; this.messageLink.appendChild(this.icon = document.createElement('div')); this.icon.className = 'pushup_icon'; this.messageLink.appendChild(this.message = document.createElement('span')); this.message.className = 'pushup_message'; this.message.innerHTML = this.options.message; // reminder message if cookies are enabled var hours = this.options.reminder.hours; if (hours && Pushup.cookiesEnabled) { this.pushup.appendChild(this.reminder = document.createElement('a')); this.reminder.href = '#'; this.reminder.className = 'pushup_reminder'; this.pushup.className = 'withReminder'; var H = hours + ' hour' + (hours > 1 ? 's' : ''), message = this.options.reminder.message.replace('#{hours}', H); this.reminder.innerHTML = message; } // Older Opera doesn't handle float correctly if (Pushup.Browser.Opera && (!window.opera.version || parseFloat(window.opera.version()) < 9.25)) { this.messageLink.style.cssFloat = 'none'; this.reminder.style.cssFloat = 'none'; } Pushup.setBrowser(Pushup._updateBrowser); document.body.appendChild(this.pushup); Pushup.addEvents(); }, addEvents: function() { if (this.reminder) { Event.add(this.reminder, 'click', function(event) { Event.stop(event); Pushup.setReminder(Pushup.options.reminder.hours); Pushup.fade(); }); } Event.add(this.pushup, 'mouseover', Pushup.clearFade); Event.add(this.pushup, 'mouseout', function() { Pushup.fade({ delay: Pushup.options.fadeDelay }) }); }, setBrowser: function(browser) { browser = browser || 'IE'; setPngBackground(this.icon, this.images + browser.toLowerCase() + '.png'); this.messageLink.href = this.updateLinks[browser]; }, show: function() { // default to IE if no browser was detected var browser = typeof arguments[0] == 'string' ? arguments[0] : Pushup._browserUsed || 'IE', options = arguments[browser ? 1 : 0] || {}; if (options.resetReminder) Pushup.resetReminder(); // show if not blocked by cookie if (!options.ignoreReminder && Pushup.cookiesEnabled && Cookie.get('_pushupBlocked')) return; if (!Pushup.pushup) Pushup.build(); Opacity.set(Pushup.pushup, 0); Pushup.pushup.style.display = 'block'; if (browser) Pushup.setBrowser(browser); this.appear({ fadeAfter: true, delay: Pushup.options.appearDelay }); }, appear: function(delay) { Pushup.clearFade(); var options = arguments[0] || {}; return window.setTimeout(function() { Appear(Pushup.pushup, { afterFinish: function() { if (options.fadeAfter) Pushup.fade({ delay: Pushup.options.fadeDelay }); }}); }, (options.delay || 0.01) * 1000); }, clearFade: function() { if (Pushup._fadeTimer) { window.clearTimeout(Pushup._fadeTimer); Pushup._fadeTimer = null; } }, fade: function() { var options = arguments[0] || {}; Pushup._fadeTimer = window.setTimeout(function() { Fade(Pushup.pushup); }, (options.delay || 0.01) * 1000); }, setReminder: function(hours) { Cookie.set('_pushupBlocked', 'blocked', { duration: 1 / 24 * hours }) }, resetReminder: function() { Cookie.remove('_pushupBlocked') } }); // Opacity adapted from the Prototype JavaScript framework // http://www.prototypejs.org var Opacity = { set: function(element, value) { element.style.opacity = (value == 1 || value === '') ? '' : (value < 0.00001) ? 0 : value; }, get: function(element) { var opacity = element.style.opacity; return opacity ? parseFloat(opacity) : 1.0; } }; if (Pushup.Browser.IE) { Opacity.get = function(element) { var opacity = element.style.opacity; if (!opacity && element.currentStyle) opacity = element.currentStyle[opacity]; if (opacity = (element.style.filter || '').match(/alpha\(opacity=(.*)\)/)) if (opacity[1]) return parseFloat(opacity[1]) / 100; return 1.0; }; Opacity.set = function(element, value) { function stripAlpha(filter) { return filter.replace(/alpha\([^\)]*\)/gi,'') } var currentStyle = element.currentStyle; if ((currentStyle && !currentStyle.hasLayout) || (!currentStyle && element.style.zoom == 'normal')) element.style.zoom = 1; var filter = element.style.filter, style = element.style; if (value == 1 || value === '') (filter = stripAlpha(filter)) ? style.filter = filter : style.filter = ''; else style.filter = stripAlpha(filter) + 'alpha(opacity=' + (value * 100) + ')'; }; } function Appear(element) { var current = Opacity.get(element), options = arguments[1] || {}; if (element.style.display != 'block') element.style.display = 'block'; if (current < 1) { setTimeout(function() { Opacity.set(element, current += 0.05); Appear(element, options); }, 0.01); } else { if (Pushup.Browser.IE && element.style.filter) element.style.removeAttribute('filter'); if (options.afterFinish) options.afterFinish.call(); } } function Fade(element) { var current = Opacity.get(element), options = arguments[1] || {}; if (current > 0) { setTimeout(function() { Opacity.set(element, current -= 0.05); Fade(element, options); }, 0.01); } else { element.style.display = 'none'; if (options.afterFinish) options.afterFinish.call(); } } function setPngBackground(element, url) { var options = Extend({ align: 'top left', repeat: 'no-repeat', sizingMethod: 'crop', backgroundColor: '' }, arguments[2] || {}); Extend(element.style, arguments.callee.IEBelow7 ? { filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + url + '\'\', sizingMethod=\'' + options.sizingMethod + '\')' } : { background: options.backgroundColor + ' url(' + url + ') ' + options.align + ' ' + options.repeat }); } setPngBackground.IEBelow7 = Pushup.Browser.IE && parseFloat(/MSIE ([\d.]+)/.exec(navigator.userAgent)[1]) < 7; // Based on the work of Peter-Paul Koch - http://www.quirksmode.org var Cookie = { set: function(name, value) { var expires = '', options = arguments[2] || {}; if (options.duration) { var date = new Date(); date.setTime(date.getTime() + options.duration * 1000 * 60 * 60 * 24); value += '; expires=' + date.toGMTString(); } document.cookie = name + "=" + value + expires + "; path=/"; }, remove: function(name) { this.set(name, '', -1) }, get: function(name) { var cookies = document.cookie.split(';'), nameEQ = name + "="; for (var i = 0, l = cookies.length; i < l; i++) { var c = cookies[i]; while (c.charAt(0) == ' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); } return null; } }; // check if cookies are enabled Pushup.cookiesEnabled = (function(test) { if (Cookie.get(test)) return true; Cookie.set(test, 'test', { duration: 15 }); return Cookie.get(test); })('_pushupCookiesEnabled'); var Event = { add: function(obj, type, fn) { if (obj.attachEvent) { obj['e' + type + fn] = fn; obj[type + fn] = function(){ obj['e' + type +fn](window.event) }; obj.attachEvent('on' + type, obj[type + fn]); } else obj.addEventListener(type, fn, false); }, stop: function(event) { if (Pushup.Browser.IE) { event.cancelBubble = true; event.returnValue = false; } else { event.preventDefault(); event.stopPropagation(); } } }; Event.add(window, 'load', function() { Pushup.start() }); })();