Moviefone + GCal or YCal

By Xtina Last update Jan 18, 2009 — Installed 113 times.

There are 3 previous versions of this script.

// ==UserScript==
// @name           Moviefone + GCal or YCal
// @namespace      http://axisofevil.net/~xtina/
// @description    Adds a link to add future movies to GCal or YCal.
// @include        http://www.moviefone.com/movie/*/synopsis
// ==/UserScript==

// Set to true or false depending on which calendars you want.
var withGoogle = true;
var withYahoo = false;
// Don't touch anything else!

// Yahoo! icon.
var ySrc = "data:image/x-icon;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAD9gAAAMAAAADDAAAB44AAA7GAAAcZwAAOP8AAP4AAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AAD//wAA//8AAPAnAAD8/wAA/PMAAPhxAADxOQAA45gAAMcAAAAB/wAA//8AAP//AAD//wAA+P3/AP/8/wD9/P8A+vz/AP/7/wD/+v8A/vr/APz6/wD4+v8A+/n/APP5/wD/+P8A+vj/AO/4/wDm+P8A2fj/AP/3/wD/9v8A9vb/AP/1/wD69f8A9PT/AO30/wD/8/8A//L/APnx/wD28P8A///+APj//gD2//4A9P/+AOP//gD//f4A6f/9AP///AD2//wA8//8APf9/AD///sA/v/7AOD/+wD/+vsA9/X7APr/+gDv/voA///5AP/9+QD/+/kA+e35AP//+ADm//gA4f/4AP/9+AD0+/gA///3APv/9wDz//cA8f/3AO3/9wD/8fcA//32AP369gDr+vYA8f/1AOv/9QD/+/UA///0APP/9ADq//QA///zAP/18wD///IA/fzyAP//8QD///AA9//wAPjw8AD//+8A8//vAP//7gD9/+4A9v/uAP/u7gD//+0A9v/tAP7/6wD/+eoA///pAP//6AD2/+gA//nnAP/45wD38eYA/fblAP/25AD29uQA7N/hAPzm4AD/690AEhjdAAAa3AAaJdsA//LXAC8g1gANH9YA+dnTAP/n0gDh5dIADyjSABkk0gAdH9EABxDRAP/l0AAAJs4AGRTOAPPczQAAKs0AIi7MAA4UywD56soA8tPKANTSygD/18kA6NLHAAAjxwDj28QA/s7CAP/1wQDw3r8A/9e8APrSrwDCtqoAzamjANmPiQDQj4YA35mBAOmefgDHj3wA1qR6AO+sbwDpmm8A2IVlAKmEYgCvaFoAvHNXAEq2VgA5s1UAPbhQAFWtTwBStU0ARbNNAEGxTQA7tEwAObZIAEq5RwDKdEYAULhDANtuQgBEtTwA1ls3ALhgMQCxNzEA2FsvAEC3LQB0MCkAiyYoANZTJwDLWyYAtjMlALE6JACZNSMAuW4iANlgIgDoWCEAylwgAMUuIAD3Vh8A52gdALRCHQCxWhwAsEkcALU4HACMOBwA0V4bAMYyGgCPJRoA218ZAJM7FwC/PxYA0msVAM9jFQD2XBUAqioVAIAfFQDhYRQAujMTAMUxEwCgLBMAnxIPAMsqDgCkFgsA6GMHALE2BAC9JQAAliIAAFYTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AsbGxsbGxsbGxsbGxsbGxd7IrMg8PDw8PDw8PUBQeJXjQYE9PcKPM2NfP2sWhcg+BzTE7dLjbmG03YWaV4JYye8MPbsLZlEouKRRCg9SXMoW/U53enGRAFzCRtNO7mTiAyliw30gRTg9VbJCKfYs0j9VmuscfLTFbIy8SOhA0Inq5Y77GNBMYIxQUJzM2Vxx2wEmfyCYWMRldXCg5MU0aicRUms58SUVeRkwjPBRSNIfBMkSgvWkyPxVHFIaMSx1/0S9nkq7WdWo1a43Jt2UqgtJERGJ5m6K8y92znpNWIYS1UQ89Mmg5cXNaX0EkGyyI3KSsp6mvpaqosaatq7axsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";

// Google icon.
var gSrc = "data:image/x-icon;base64,AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8A//3/AP39/wD6/f8A+P3/AP/8/wD9/P8A+vz/AP/7/wD/+v8A/vr/APz6/wD4+v8A+/n/APP5/wD/+P8A+vj/AO/4/wDm+P8A2fj/AP/3/wD/9v8A9vb/AP/1/wD69f8A9PT/AO30/wD/8/8A//L/APnx/wD28P8A///+APj//gD2//4A9P/+AOP//gD//f4A6f/9AP///AD2//wA8//8APf9/AD///sA/v/7AOD/+wD/+vsA9/X7APr/+gDv/voA///5AP/9+QD/+/kA+e35AP//+ADm//gA4f/4AP/9+AD0+/gA///3APv/9wDz//cA8f/3AO3/9wD/8fcA//32AP369gDr+vYA8f/1AOv/9QD/+/UA///0APP/9ADq//QA///zAP/18wD///IA/fzyAP//8QD///AA9//wAPjw8AD//+8A8//vAP//7gD9/+4A9v/uAP/u7gD//+0A9v/tAP7/6wD/+eoA///pAP//6AD2/+gA//nnAP/45wD38eYA/fblAP/25AD29uQA7N/hAPzm4AD/690AEhjdAAAa3AAaJdsA//LXAC8g1gANH9YA+dnTAP/n0gDh5dIADyjSABkk0gAdH9EABxDRAP/l0AAAJs4AGRTOAPPczQAAKs0AIi7MAA4UywD56soA8tPKANTSygD/18kA6NLHAAAjxwDj28QA/s7CAP/1wQDw3r8A/9e8APrSrwDCtqoAzamjANmPiQDQj4YA35mBAOmefgDHj3wA1qR6AO+sbwDpmm8A2IVlAKmEYgCvaFoAvHNXAEq2VgA5s1UAPbhQAFWtTwBStU0ARbNNAEGxTQA7tEwAObZIAEq5RwDKdEYAULhDANtuQgBEtTwA1ls3ALhgMQCxNzEA2FsvAEC3LQB0MCkAiyYoANZTJwDLWyYAtjMlALE6JACZNSMAuW4iANlgIgDoWCEAylwgAMUuIAD3Vh8A52gdALRCHQCxWhwAsEkcALU4HACMOBwA0V4bAMYyGgCPJRoA218ZAJM7FwC/PxYA0msVAM9jFQD2XBUAqioVAIAfFQDhYRQAujMTAMUxEwCgLBMAnxIPAMsqDgCkFgsA6GMHALE2BAC9JQAAliIAAFYTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AsbGxsbGxsbGxsbGxsbGxd7IrMg8PDw8PDw8PUBQeJXjQYE9PcKPM2NfP2sWhcg+BzTE7dLjbmG03YWaV4JYye8MPbsLZlEouKRRCg9SXMoW/U53enGRAFzCRtNO7mTiAyliw30gRTg9VbJCKfYs0j9VmuscfLTFbIy8SOhA0Inq5Y77GNBMYIxQUJzM2Vxx2wEmfyCYWMRldXCg5MU0aicRUms58SUVeRkwjPBRSNIfBMkSgvWkyPxVHFIaMSx1/0S9nkq7WdWo1a43Jt2UqgtJERGJ5m6K8y92znpNWIYS1UQ89Mmg5cXNaX0EkGyyI3KSsp6mvpaqosaatq7axsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";

// Get the release date.
var movieDate = getElementsByClassName(document, "div", "label");
for (var x = 0; x < movieDate.length; x++) {
	if (movieDate[x].innerHTML == "Theatrical Release Date:") {
		var dateBit = movieDate[x].nextSibling.nextSibling;
		var tmp = dateBit.innerHTML;
		break;
	}
}
movieDate = new Date();
movieDate.setFullYear(tmp.split("/")[2], tmp.split("/")[0], tmp.split("/")[1]);
var todaysDate = new Date();

// Only if it's tomorrow.
if (movieDate > todaysDate) {
// Get the title.
	var movieTitle = getElementsByClassName(document, "div", "productheader")[0].childNodes[1].childNodes[0].nodeValue;

// Get synopsis and lose the HTMLing.
	var movieOpsis = getElementsByClassName(document, "div", "synopsis")[0].childNodes[3].childNodes[1].innerHTML;
	movieOpsis = movieOpsis.replace(/<\/a>/gi, "");
	movieOpsis = movieOpsis.replace(/<strong>/gi, "");
	movieOpsis = movieOpsis.replace(/<\/strong>/gi, "");
	movieOpsis = movieOpsis.replace(/<a href=\"[-0-9a-z\/]*\">/gi, "");

// Get the URL.
	var movieURL = window.location.href;

// Calendarise - Yahoo.
	if (withYahoo) {
		var ycalThis = "http://calendar.yahoo.com/?v=60&TYPE=23&TITLE=";

// Add the title bit.
		ycalThis += escape(trim(movieTitle)) + "&ST=";

// Add the dates.
		ycalThis += movieDate.getFullYear() + '' + Right('0' + movieDate.getMonth(), 2) + '' + Right('0' + movieDate.getDate(), 2) + '&DESC=';

// Add the description as a whole.
		ycalThis += escape(movieURL + "\n\n" + movieOpsis) + "&URL=" + movieURL;

// And finally, put this as a link, next to the date.
		var ycalBit = document.createElement("a");
		ycalBit.setAttribute("href", ycalThis);
		ycalBit.setAttribute("target", "_blank");

		var tmp = document.createElement("img");
		tmp.setAttribute("src", ySrc);
		tmp.setAttribute("style", "vertical-align: middle;");
		ycalBit.appendChild(tmp);

		dateBit.innerHTML += " ";
		dateBit.appendChild(ycalBit);
	}

// Calendarise - Google.
	if (withGoogle) {
		var gcalThis = "http://www.google.com/calendar/event?action=TEMPLATE&text=Movie%3A%20";

// Add the title bit.
		gcalThis += escape(trim(movieTitle)) + "&dates=";

// Add the dates.
		gcalThis += movieDate.getFullYear() + '' + Right('0' + movieDate.getMonth(), 2) + '' + Right('0' + movieDate.getDate(), 2) + '/';
		gcalThis += movieDate.getFullYear() + '' + Right('0' + movieDate.getMonth(), 2) + '' + Right('0' + (movieDate.getDate() + 1), 2) + '&details=';

// Add the description as a whole.
		gcalThis += escape(movieURL + "\n\n" + movieOpsis);

// And finally, put this as a link, next to the date.
		var gcalBit = document.createElement("a");
		gcalBit.setAttribute("href", gcalThis);
		gcalBit.setAttribute("target", "_blank");

		var tmp = document.createElement("img");
		tmp.setAttribute("src", gSrc);
		tmp.setAttribute("style", "vertical-align: middle;");
		gcalBit.appendChild(tmp);

		dateBit.innerHTML += " ";
		dateBit.appendChild(gcalBit);
	}
}


/* *** Useful Functions *** */


// Code from: http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all :
        oElm.getElementsByTagName(strTagName);

    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];     
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }   
    }
    return (arrReturnElements)
}

// Code from: http://snipplr.com/view.php?codeview&id=8329
function trim(str) {
    while('' + str.charAt(0) == ' ') {
        str = str.substring(1, str.length);
    }
    while('' + str.charAt(str.length-1)==' ') {
        str = str.substring(0, str.length-1);
    }
    return str;
}

// Code from: http://www.expertsforge.com/Web-Development/Tutorial-218.asp
function Right(str, n) {
	if (n <= 0)
		return "";
	else if (n > String(str).length)
		return str;
	else {
		var iLen = String(str).length;
		return String(str).substring(iLen, iLen - n);
	}
}