From 9cb4d5f2bebc77d9364e8d8b4466ba85a3023aee Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Mon, 13 Jun 2011 22:31:23 +0200 Subject: [PATCH] favicon; pinned site features (IE9); speeddial icon (Opera); --- app/views/layouts/application.html.haml | 16 +- config/assets.yml | 1 + public/favicon.ico | Bin 0 -> 24038 bytes public/images/9minutes-logo.png | Bin 0 -> 6907 bytes public/javascripts/helper/foreach.js | 1 + public/javascripts/pinify.js | 61 ++++ public/javascripts/player.js | 6 +- public/javascripts/plugins/pinify.js | 426 ++++++++++++++++++++++++ 8 files changed, 507 insertions(+), 4 deletions(-) create mode 100644 public/images/9minutes-logo.png create mode 100644 public/javascripts/helper/foreach.js create mode 100644 public/javascripts/pinify.js create mode 100644 public/javascripts/plugins/pinify.js diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index ffd8e4b..b14b72b 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -5,8 +5,22 @@ = include_stylesheets :common, :media=>'all' = javascript_include_tag "http://www.google.com/jsapi" = include_javascripts :jquery, :helper, :plugins, :common - + = favicon_link_tag + = favicon_link_tag "9minutes-logo.png", :rel=>"icon", :type=>"image/png" = csrf_meta_tag + :plain + + + + + + + + %body #loading Loading #error Error diff --git a/config/assets.yml b/config/assets.yml index 2fca49a..6678384 100644 --- a/config/assets.yml +++ b/config/assets.yml @@ -11,6 +11,7 @@ javascripts: - public/javascripts/plugins/*.js common: - public/javascripts/config.js + - public/javascripts/pinify.js - public/javascripts/player.js - public/javascripts/search.js - public/javascripts/store.js diff --git a/public/favicon.ico b/public/favicon.ico index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3c825fb2855de2d11d27840e316c301bf99fcdc2 100644 GIT binary patch literal 24038 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 z Us1>zlo6BxBg`uC|k=^EM7{lX@;19qG8>k7TGUuC9^%~0gik^WelfCTY5C$IXV+!WDT z`Pu#J8ftt&Iw&#~n!VoRM(!dj^8$g=dsv}4;ES^l9EXC^!UK;y}r10BRiN&hVyI%46K4j%PV~20GHq@84yE}BWT@CpMd83T3)cv z+M%^PWI~nW`Fdh2_@;OHKqZ3Ge#aw2n-_@~Z}#Z|>9p_164V*rC4Rr~hn0Kt-O-fa zq7?= zD;<{>|Fq*W!$La+>Wzc2X^*Yn@3}?o*E|_3`zmMHef577NldX$CA&_^F1!gI%SRlLL0nD=!6y&i%OFnlG?s(uyy z^g+rPQEJ+7nM+N8b%m1;=8&(GOzY7kdCUGEd1gC9>hW;opF3t)9P6jvksRS;F;DP8 zjLvdIs=Kdv#-HhDNkBn7X^mA#w?ph3TTV}sb?Zrm4k)vUPIs1{Wf(Y;UIoXKh+seU z4n7f>ml;0;UXK`Xr6CJ@Ni|~RDNx{Lbu6-?Wx_DiF2~r`>L%{7b~Q8)Qvx3ApLKha zE*;Vngw?A6Cu{q|0fG>T8pSjXA-0ugBsFxMn&4qD;g7 z?mOZ9!9Bsj1?IpO!03@!+7m>{G3^;Pv9IprWC9MTr_!jC%qO0M9io zrApa2nJ3b9dymL=%;;`)_!wOX)+DX-Adp6t0ufN9@C}QzQmDCYPOt<{1Goj0Z4*p9 z2XaGE>ygphbV|V&y4!%`iE*#~a&SAisCDV5louI}ih)4!#|9O9DjYEW|G)BXIll#> Y-$701{^45O{Vo7n>UwHbD#+LW1LYx-7XSbN literal 0 HcmV?d00001 diff --git a/public/javascripts/helper/foreach.js b/public/javascripts/helper/foreach.js new file mode 100644 index 0000000..9848999 --- /dev/null +++ b/public/javascripts/helper/foreach.js @@ -0,0 +1 @@ +Array.prototype.foreach = function( callback ) { for( var k=0; k'); //$listElement.append(''); - } - } + // } + // } /* $('ul#playlist').dragsort({ dragSelector: '.drag-handle', @@ -61,7 +61,7 @@ function initPlaylist() { $('#playlist-navigation .clear').live('click', function(){ $('#playlist li').remove(); $.store.clear(); - });*/ + }); } /* function savePlaylist() { diff --git a/public/javascripts/plugins/pinify.js b/public/javascripts/plugins/pinify.js new file mode 100644 index 0000000..ba719d2 --- /dev/null +++ b/public/javascripts/plugins/pinify.js @@ -0,0 +1,426 @@ +/*! +* jQuery pinify Plugin v1.2 +* http://ie9ify.codeplex.com +* +* Copyright 2011, Brandon Satrom and Clark Sell +* Licensed under MS-PL. +* http://ie9ify.codeplex.com/license +* +* Date: Wednesday May 11 2011 11:47:27 -05 +*/ +(function ($, undefined) { + //private functions + function createMetaTag(name, content, head) { + if ($('meta[name=' + name + ']').length && name !== 'msapplication-task') { + return; + } + + if (!content.length) { return; } + + $('', { + name: name, + content: content + }).appendTo(head); + } + + function siteModeSupported() { + return (!!window.external) && ('msIsSiteMode' in window.external); + } + + /* pinify jQuery Functions: + * init: Adds meta tags and startup tasks to a page + * enablePinning: Enables a content item to be enabled for pinning (meaning that it can be dragged to the taskbar to pin a site) + * enableSiteMode: Enables binding of an event that triggers a site mode dialog (asking if the user wants to pin the site to the *start* menu) + * pinTeaser: Adds a teaser bar to the site, directly underneath the address bar. Teaser bar encourages the user to pin the site. + */ + var methods = { + init: function (options) { + var defaultOptions = { + applicationName: document.title.toString(), + favIcon: 'http://' + location.host + '/favicon.ico', + navColor: '', + startUrl: 'http://' + location.host, + tooltip: document.title.toString(), + window: 'width=800;height=600', + tasks: [] + }; + + options = $.extend({}, defaultOptions, options); + + return this.each(function () { + var taskList = options.tasks; + var head = this; + + if ($('link[type^=image]').length === 0) { + $("", { + rel: "shortcut icon", + type: "image/ico", + href: options.favIcon + }).appendTo(this); + + } + + createMetaTag('application-name', options.applicationName, this); + createMetaTag('msapplication-tooltip', options.tooltip, this); + createMetaTag('msapplication-starturl', options.startUrl, this); + createMetaTag('msapplication-navbutton-color', options.navColor, this); + createMetaTag('msapplication-window', options.window, this); + + $.each(taskList, function (key, value) { + createMetaTag('msapplication-task', 'name=' + value.name + ';action-uri=' + value.action + ';icon-uri=' + value.icon, head); + }); + }); + }, + enablePinning: function (title) { + return this.each(function () { + title = title || "Drag this image to your Windows 7 Taskbar to pin this site with IE9"; + + $(this).addClass('msPinSite').attr("title", title); + }); + }, + enableSiteMode: function (eventName) { + eventName = eventName || "click"; + + return this.each(function () { + $(this).bind(eventName, function (event) { + event.preventDefault(); + + try { + window.external.msAddSiteMode(); + } catch (e) { } + }); + }); + }, + pinTeaser: function (options) { + if (window.external.msIsSiteMode()) { + return this; + } + + var teaser = $(this); + var defaultOptions = { + type: 'hangingChad', //Options are: hangingChad, topHat, brandedTopHat and doubleTopHat + icon: 'http://' + location.host + '/favicon.ico', + pinText: 'Drag this image to the taskbar to pin this site', + secondaryText: 'Simply drag the icon or tab to taskbar to pin.', + addStartLink: true, + linkText: 'Click here to add this site to the start menu', + sticky: true, + timeout: 10000, + style: { + linkColor: 'rgb(0, 108, 172)', + backgroundColor: 'rgb(0, 108, 172)', + textColor: 'white', + backgroundImage: null, + leftBackgoundImage: null, + rightBackgoundImage: null, + closeButtonImage: null + } + }; + var alignmentDiv, contentDiv, leftDiv, leftBar, rightDiv, mainContent; + var builder = { + topHat: function () { + teaser.addClass('pinify-topHat-container pinify-teaser').css('color', options.style.textColor); + if (options.style.backgoundImage) { + teaser.css('background-image', options.style.backgroundImage); + } + alignmentDiv = $('
', { 'class': 'pinify-topHat-alignment' }).appendTo(teaser); + contentDiv = $('
', { 'class': 'pinify-topHat-content' }).appendTo(alignmentDiv); + $('', { id: 'pinify-topHat-logo', src: options.icon, alt: 'Drag Me', 'class': 'msPinSite' }).appendTo(contentDiv); + $('').addClass('pinify-topHat-text').text(options.pinText).appendTo(contentDiv); + }, + brandedTopHat: function () { + teaser.addClass('pinify-brandedTopHat-container pinify-teaser').css('color', options.style.textColor); + if (options.style.backgoundImage) { + teaser.css('background-image', options.style.backgroundImage); + } + + contentDiv = $('
', { 'class': 'pinify-brandedTopHat-content' }).appendTo(teaser); + $('', { id: 'pinify-brandedTopHat-firstLogo', src: options.icon, alt: 'Drag Me', 'class': 'msPinSite' }).appendTo(contentDiv); + $('', { id: 'pinify-brandedTopHat-thirdLogo', src: options.icon, alt: 'Drag Me', 'class': 'msPinSite' }).appendTo(contentDiv); + $('
', { 'class': 'pinify-mainText' }).text(options.pinText).appendTo(contentDiv); + $('
', { 'class': 'pinify-brandedTopHat-secondaryText' }).text(options.secondaryText).appendTo(contentDiv); + }, + doubleTopHat: function () { + teaser.addClass('pinify-doubleTopHat-container pinify-teaser').css('color', options.style.textColor); + + leftDiv = $('
', { 'class': 'pinify-doubleTopHat-left' }).appendTo(teaser); + if (options.style.leftBackgroundImage) { + $(leftDiv).css('background-image', options.style.leftBackgoundImage); + } + leftBar = $('
', { id: 'pinify-doubleTopHat-leftBar' }).appendTo(leftDiv); + $('', { id: 'pinify-doubleTopHat-logo', src: options.icon, alt: 'Drag Me', 'class': 'msPinSite' }).appendTo(leftBar); + + rightDiv = $('
', { 'class': 'pinify-doubleTopHat-right' }).appendTo(teaser); + if (options.style.rightBackgroundImage) { + $(rightDiv).css('background-image', options.style.rightBackgoundImage); + } + $('
', { id: 'pinify-doubleTopHat-rightBar' }).appendTo(rightDiv); + mainContent = $('
', { id: 'pinify-doubleTopHat-rightBarMainContent' }).appendTo(rightDiv); + $('
', { 'class': 'pinify-mainText' }).text(options.pinText).appendTo(mainContent); + $('
', { 'class': 'pinify-doubleTopHat-lighterText' }).text(options.secondaryText).appendTo(rightDiv); + }, + hangingChad: function () { + teaser.hide(); + teaser.css({ 'color': options.style.textColor, 'background-color': options.style.backgroundColor }).addClass('pinify-hanging-container pinify-teaser'); + $('', { src: options.icon, 'class': 'msPinSite' }).appendTo(teaser); + $('
', { 'class': 'pinify-hanging-content' }).appendTo(teaser); + $('
', { id: 'pinify-pinText' }).text(options.pinText).appendTo(teaser); + teaser.fadeIn('slow'); + } + }; + + options = $.extend({}, defaultOptions, options); + + return this.each(function () { + //Call the correct builder function based on the type passed in + builder[options.type](); + + //If it's not a sticky teaser, fade it out after a delay. Otherwise put a close button on the div + if (!options.sticky) { + this.delay(options.timeout).fadeOut('slow'); + } else { + $('
').addClass('pinify-closePin').click(function () { + $('.pinify-teaser').slideUp('slow'); + teaser.slideUp('slow'); + }).appendTo(teaser); + } + + if (!options.addStartLink) { + return; + } + + $('').addClass('pinify-addSiteLink').attr('href', '#').click(function (event) { + event.preventDefault(); + + try { + window.external.msAddSiteMode(); + } catch (e) { } + }).css('color', options.linkColor).appendTo(teaser).text(options.linkText); + }); + } + }; + + //main entry point for pinify methods that operate on a jQuery wrapped set (above) + $.fn.pinify = function (method) { + if (!siteModeSupported()) { + return this; + } + + if (methods[method]) { + return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); + } else if (typeof method === 'object' || !method) { + return methods.init.apply(this, arguments); + } else { + $.error('Method ' + method + ' does not exist on jQuery.pinify'); + } + }; + + /* pinify Utility Functions + * firstRunState: determines wheter a pinned site has been lanched for the first time + * isPinned: Returns true if the site is pinned to the taskbar, false if not + * addJumpList: Given options, adds jumplist items to a pinned window + * clearJumpList: Clears all dynamic jumplist items from the pinned window + * addOverlay: Given options, adds an overlay icon to the taskbar for the pinned site + * clearOverlay: Clears the current overlay icon + * flashTaskbar: Flashes the taskbar box of a pinned site + * createThumbbarButtons: creates buttons on the pinned site preview window thumbbar, and wires events to respond to button clicks + */ + $.pinify = {}; //create the pinify namespace for all of our pinify utilty functions + + /* Return Values + * 0 = The pinned site is not in a first run state, or is not pinned + * 1 = First run from a drag and drop operation + * 2 = First run from a shortcut added to the Start menu (msAddSiteMode) + */ + $.pinify.firstRunState = function (preserveState) { + if (!siteModeSupported()) { + return 0; + } + + if (preserveState) { + preserveState = false; + } + + try { + return window.external.msIsSiteModeFirstRun(preserveState); + } catch (e) { + return 0; + } + }; + + $.pinify.isPinned = function () { + if (!siteModeSupported()) { + return false; + } + + try { + return window.external.msIsSiteMode(); + } catch (e) { + return false; + } + }; + + $.pinify.addJumpList = function (options) { + if (!siteModeSupported()) { + return this; + } + + var defaultOptions = { + title: '', + items: [] + }; + + options = $.extend({}, defaultOptions, options); + + try { + if (window.external.msIsSiteMode()) { + window.external.msSiteModeClearJumplist(); + window.external.msSiteModeCreateJumplist(options.title); + + var items = options.items; + + $.each(items, function (key, value) { + window.external.msSiteModeAddJumpListItem(value.name, value.url, value.icon); + }); + + window.external.msSiteModeShowJumplist(); + } + } catch (e) { } + + return this; + }; + + $.pinify.clearJumpList = function () { + if (!siteModeSupported()) { + return this; + } + + try { + if (window.external.msIsSiteMode()) { + window.external.msSiteModeClearJumpList(); + } + } catch (e) { } + }; + + $.pinify.addOverlay = function (options) { + if (!siteModeSupported()) { + return this; + } + + var defaultOptions = { + eventName: 'click', + title: '', + icon: '' + }; + + options = $.extend({}, defaultOptions, options); + + try { + if (window.external.msIsSiteMode()) { + window.external.msSiteModeClearIconOverlay(); + window.external.msSiteModeSetIconOverlay(options.icon, options.title); + } + } catch (e) { } + }; + + $.pinify.clearOverlay = function () { + if (!siteModeSupported()) { + return this; + } + + try { + if (window.external.msIsSiteMode()) { + window.external.msSiteModeClearIconOverlay(); + } + } catch (e) { } + }; + + $.pinify.flashTaskbar = function (options) { + if (!siteModeSupported()) { + return this; + } + + try { + if (window.external.msIsSiteMode()) { + window.external.msSiteModeActivate(); + } + } catch (e) { } + }; + + $.pinify.createThumbbarButtons = function (options) { + if (!siteModeSupported()) { + return this; + } + + var defaultOptions = { + buttons: [] + }; + + options = $.extend({}, defaultOptions, options); + + try { + if (window.external.msIsSiteMode()) { + var buttons = []; + //Create a ButtonStyle Object to hold a reference to the current button, an alternate style, + //if any, and the active Style + var ButtonStyle = function () { }; + ButtonStyle.prototype.button = null; + ButtonStyle.prototype.alternateStyle = null; + ButtonStyle.prototype.activeStyle = 0; + ButtonStyle.prototype.click = null; + + //Create the method to respond to thumbbar button clicks + var clickCurrent = function (btn) { + var curr = buttons[btn.buttonID]; + curr.click(); + + if (curr.alternateStyle) { + var newStyle = curr.activeStyle === 0 ? curr.alternateStyle : 0; + window.external.msSiteModeShowButtonStyle(curr.button, newStyle); + curr.activeStyle = newStyle; + } + }; + + $.each(options.buttons, function (key, value) { + var btn = window.external.msSiteModeAddThumbBarButton(value.icon, value.name); + var altBtn; + + if (value.alternateStyle) { + var style = value.alternateStyle; + altBtn = window.external.msSiteModeAddButtonStyle(btn, style.icon, style.name); + } + + var buttonStyle = new ButtonStyle(); + buttonStyle.button = btn; + buttonStyle.alternateStyle = altBtn; + buttonStyle.click = value.click; + buttons[btn] = buttonStyle; + + document.addEventListener('msthumbnailclick', clickCurrent, false); + }); + + //Hide thumbbar buttons when the page is unloaded. + window.onunload = function () { + var key; + for (key in buttons) { + if (buttons.hasOwnProperty(key)) { + window.external.msSiteModeUpdateThumbBarButton(buttons[key].button, true, false); + } + } + }; + + //Make sure to re-display thumbbar buttons if they are hidden on a page unload. + window.onload = function () { + var key; + for (key in buttons) { + if (buttons.hasOwnProperty(key)) { + window.external.msSiteModeUpdateThumbBarButton(buttons[key].button, true, true); + } + } + }; + + window.external.msSiteModeShowThumbBar(); + } + } catch (e) { } + }; +})(jQuery);