// ==UserScript==
// @name PandoraGrowl
// @namespace http://www.growlforwindows.com/userscripts
// @description Sends Growl notifications from the Pandora website when the currently playing track changes
// @include http://pandora.com/
// @include http://www.pandora.com/
// ==/UserScript==
var PandoraGrowl = function(){
return {
appname : "Pandora Website",
init : function(){
PandoraGrowl.register();
unsafeWindow.Pandora.setEventHandler("SongPlayed", PandoraGrowl.songPlayed);
},
register : function(){
var ntSongPlayed = {};
ntSongPlayed.name = "songplayed";
ntSongPlayed.displayName = "Song Played";
ntSongPlayed.enabled = true;
var types = [ntSongPlayed];
GrowlMonkey.register(PandoraGrowl.appname, "http://www.growlforwindows.com/gfw/images/plugins/pandora.png", types);
},
songPlayed : function(song){
GrowlMonkey.notify(PandoraGrowl.appname, "songplayed", "Pandora track changed", song.songName + "\n" + song.artistName, song.artURL);
}
}
}();
// -- GrowlMonkey stuff below here - do not edit
GrowlMonkey = function(){
function fireGrowlEvent(type, data){
var element = document.createElement("GrowlEventElement");
element.setAttribute("data", JSON.stringify(data));
document.documentElement.appendChild(element);
var evt = document.createEvent("Events");
evt.initEvent(type, true, false);
element.dispatchEvent(evt);
}
return {
register : function(appName, icon, notificationTypes){
var r = {};
r.appName = appName;
r.icon = icon;
r.notificationTypes = notificationTypes;
fireGrowlEvent("GrowlRegister", r);
},
notify : function(appName, notificationType, title, text, icon){
var n = {};
n.appName = appName;
n.type = notificationType;
n.title = title;
n.text = text;
n.icon = icon;
fireGrowlEvent("GrowlNotify", n);
}
}
}();
/* json2.js
* 2008-01-17
* Public Domain
* No warranty expressed or implied. Use at your own risk.
* See http://www.JSON.org/js.html
*/
if(!this.JSON){JSON=function(){function f(n){return n<10?'0'+n:n;}
Date.prototype.toJSON=function(){return this.getUTCFullYear()+'-'+
f(this.getUTCMonth()+1)+'-'+
f(this.getUTCDate())+'T'+
f(this.getUTCHours())+':'+
f(this.getUTCMinutes())+':'+
f(this.getUTCSeconds())+'Z';};var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};function stringify(value,whitelist){var a,i,k,l,r=/["\\\x00-\x1f\x7f-\x9f]/g,v;switch(typeof value){case'string':return r.test(value)?'"'+value.replace(r,function(a){var c=m[a];if(c){return c;}
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+
(c%16).toString(16);})+'"':'"'+value+'"';case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}
if(typeof value.toJSON==='function'){return stringify(value.toJSON());}
a=[];if(typeof value.length==='number'&&!(value.propertyIsEnumerable('length'))){l=value.length;for(i=0;i<l;i+=1){a.push(stringify(value[i],whitelist)||'null');}
return'['+a.join(',')+']';}
if(whitelist){l=whitelist.length;for(i=0;i<l;i+=1){k=whitelist[i];if(typeof k==='string'){v=stringify(value[k],whitelist);if(v){a.push(stringify(k)+':'+v);}}}}else{for(k in value){if(typeof k==='string'){v=stringify(value[k],whitelist);if(v){a.push(stringify(k)+':'+v);}}}}
return'{'+a.join(',')+'}';}}
return{stringify:stringify,parse:function(text,filter){var j;function walk(k,v){var i,n;if(v&&typeof v==='object'){for(i in v){if(Object.prototype.hasOwnProperty.apply(v,[i])){n=walk(i,v[i]);if(n!==undefined){v[i]=n;}}}}
return filter(k,v);}
if(/^[\],:{}\s]*$/.test(text.replace(/\\./g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof filter==='function'?walk('',j):j;}
throw new SyntaxError('parseJSON');}};}();}
// initialize the whole works
PandoraGrowl.init();