TripIt for GMail

By Andy Denmark Last update Oct 5, 2008 — Installed 163 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0

There are 2 previous versions of this script.

// TripIt for GMail
// version 0.1 Alpha!
// 2008-01-18
// Copyright (c) 2008, TripIt, Inc.
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script that embeds an 'Add to TripIt'
//   button in the GMail UI.
//
// To install, you need Greasemonkey: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "TripIt for GMail", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name          TripIt for GMail
// @namespace     http://www.tripit.com/greasemonkey/
// @description   A script to enhance GMail to forward confirms to plans@tripit.com
// @include       http://mail.google.com/*
// @include       https://mail.google.com/*
// ==/UserScript==

var gmail = null;
var RHS_MENU_ELEMENT_CLASS='yMuNaf';
var FROM_ADDRESS_SPAN_CLASS='EP8xU';
var FORWARD_BUTTON_CLASS='XymfBd';
var FORWARD_TO_TEXTAREA_CLASS='mMl8gd';
var FORWARD_TO_ADDRESS='plans@tripit.com';
var FORWARD_MSG_DIV_CLASS='KTFFFd';
var ADD_TO_TRIPIT_ID='_add2trpt';

var TRAVEL_FROM_ADDRESSES=Object();
TRAVEL_FROM_ADDRESSES['American Airlines@aa.com']=1;

var TRIPIT_LOGO='data:application/octet-stream;base64,AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACocREArXkfAK16IACzgy8AuIs9ALiMPgC9lEwAw51bAMOeXADIpmoAyaZrAB%2BG8QAmivIAGpDzAM6ueADOr3gAzq95AM6vegA%2Bl%2FMARZv0ANO4iADUuIgASJz0AFCg9ADZwZYA2MGXAGKq9QBkq%2FUAZaz1AG2v8wDdyKIA3sqlANPIrgCBu%2FcAbcD5AOTStABryPoA3NnHAOnbwwDL2OEA7%2BTSAMDd%2BwDz690A9O3hAPr28AD%2F%2F%2F8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSwCEC0tLS0tER8tLS0tLS0oAAMsLS0tLAAGLS0tLS0tLRgfIBwNJCUYKC0tKC0KAywtLSELCwsiLS0tGAAQAAAEBg8SCxoLFg4GBgEABBQHLC0tHQspDBstLS0jABgtLS0tHx4XCxMnCCwtLS0tLS0jFRAtLRkqLSYGESMtLS0tAQctLS0FKC0tJgAGLS0tLSMoLS0QAAIsLS0GFC0tLS0tLS0tBgAAJi0tLS0tLS0tLS0tLQkAACstLS0tLS0tLS0tLS0sFCYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D';

window.addEventListener('load', function() {
    if (unsafeWindow.gmonkey) {
	unsafeWindow.gmonkey.load('1.0', function(g) {
	    gmail = g;
	    gmail.registerViewChangeCallback(addAddToTripItButton);
	});
    }
}, true);

function _createAddToTripItElement() {
    var addToTripItEl = document.createElement('div');
    addToTripItEl.setAttribute('class', 'OZly4d');

    var addToTripItSpanEl = document.createElement('span');
    addToTripItSpanEl.setAttribute('id', ADD_TO_TRIPIT_ID);

    var addToTripItImgEl = document.createElement('img');
    addToTripItImgEl.setAttribute('src', TRIPIT_LOGO);
    addToTripItSpanEl.appendChild(addToTripItImgEl);

    var addToTripItClearImgEl = document.createElement('img');
    addToTripItClearImgEl.setAttribute('src', 'images/cleardot.gif');
    addToTripItSpanEl.appendChild(addToTripItClearImgEl);

    var addToTripItUEl = document.createElement('u');
    addToTripItUEl.setAttribute('class', '');
    addToTripItUEl.innerHTML = 'Add to TripIt';
    addToTripItSpanEl.appendChild(addToTripItUEl);

    addToTripItEl.appendChild(addToTripItSpanEl);

    return addToTripItEl;
}
//http://userscripts.org/scripts/review/13700
function simulateClick(node, eventType) {
    var event = node.ownerDocument.createEvent("MouseEvents");
    event.initMouseEvent(eventType,
			 true, // can bubble
			 true, // cancellable
			 node.ownerDocument.defaultView,
			 1, // clicks
			 50, 50, // screen coordinates
			 50, 50, // client coordinates
			 false, false, false, false, // control/alt/shift/meta
			 0, // button,
			 node);
    
    node.dispatchEvent(event);
}

function evalXPath(expression, rootNode) {
    try {
	var xpathIterator = rootNode.ownerDocument.evaluate( expression,
							     rootNode,
							     null, // no namespace resolver
							     XPathResult.ORDERED_NODE_ITERATOR_TYPE,
							     null); // no existing results
    } catch (err) {
	GM_log("Error when evaluating XPath expression '" + expression + "'" +
	       ": " + err);
	return null;
    }
    var results = [];
    
    // Convert result to JS array
    for (var xpathNode = xpathIterator.iterateNext();
	 xpathNode;
	 xpathNode = xpathIterator.iterateNext()) {
	results.push(xpathNode);
    }
    
    return results;
}

function getNodesByTagNameAndClass(rootNode, tagName, className) {
    var expression =
	".//" + tagName +
	"[contains(concat(' ', @class, ' '), ' " + className + " ')]";
    
    return evalXPath(expression, rootNode);
}

function getNodesByTagName(rootNode, tagName) {
    var expression = ".//" + tagName;
    return evalXPath(expression, rootNode);
}

function _add_to_tripit(e) {
    var forwardButtonNodes = getNodesByTagNameAndClass(gmail.getActiveViewElement(), 'div', FORWARD_BUTTON_CLASS);
    simulateClick(forwardButtonNodes[0], 'click');
    
    var textAreas = getNodesByTagNameAndClass(gmail.getActiveViewElement(), 'textarea', FORWARD_TO_TEXTAREA_CLASS);
    textAreas[0].value=FORWARD_TO_ADDRESS;

    var controlPanelEls = getNodesByTagNameAndClass(gmail.getActiveViewElement(), 'div', FORWARD_MSG_DIV_CLASS);
    var buttons = getNodesByTagName(controlPanelEls[0], 'button');
    simulateClick(buttons[0], 'click');
}

function addAddToTripItButton() {
    if (gmail.getActiveViewType() == 'cv') {
        rhsEl = gmail.getConvRhsElement();
        var addToTripItDivElement = _createAddToTripItElement();
	    
        rhsEl.firstChild.firstChild.appendChild(addToTripItDivElement);
        addToTripItDivElement.addEventListener('click', _add_to_tripit, false);
        var addToTripItLinkElement = document.getElementById(ADD_TO_TRIPIT_ID);
    }
}