// pap.fr with googlemap
// version 0.1 BETA!
// 21-02-2009
// Copyright (c) 2009, Marc Powell <marc DOT powell AT yahoo DOT com>
// 
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script.  To install it, you need
// Greasemonkey 0.3 or later: 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 "pap.fr with googlemap", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name          pap.fr with googlemap
// @namespace     http://caliparisien.com/dev/greasemonkey/
// @description   Add google map to announcment descriptions
// @include       http://www.pap.fr/immobilier/*
// @exclude       
// ==/UserScript==
//
// Version history:
//  Version 0.1:
//   - Initial version!

var debug = true;
if(debug) GM_log("starting pap.fr googlemap");

// for browsers that don't support function
if (document.getElementsByClassName == undefined) {
	document.getElementsByClassName = function(className)
	{
		var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
		var allElements = document.getElementsByTagName("*");
		var results = [];

		var element;
		for (var i = 0; (element = allElements[i]) != null; i++) {
			var elementClass = element.className;
			if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass))
				results.push(element);
		}

		return results;
	}
}
	
// create gmap object
function createMap(block, address)
{
	// create map link
	var map = document.createElement('li');
	map.innerHTML = '<a href="#" onclick="window.open(\'http://maps.google.com/?q='+escape(address)+'&mrt=loc&lci=transit\', \'gmap\', \'menubar=no,toolbar=no,resizable=yes,location=no,status=no,directories=no,width=500,height=500\'); return false;" rel="nofollow" title="'+address+'">Map!</a>';
	map.className = "carte";
	
	var list = block.getElementsByTagName("ul")[0];
	list.insertBefore(map,list.firstChild);
	
	return map;
}

// extract  location
function getAddress(block)
{
	// grab  announcment text
	var ptags = block.getElementsByTagName("p");
	var text = ptags[1].textContent;

	// extract address
	var re = new RegExp("(\\d)*(\\s)*(rue|pl|place|blv|boulevard|ave|avenue)(\\s)+([^,.]*)","i");
	var m = re.exec(text);
	
	// extract metro
	if(m==null)
	{
		re = new RegExp("(metro|métro|rer)(\\s)+(?!ligne)([^,.]*)","i");
		m = re.exec(text);
	}
	
	// extract location (text from first link)
	var anchors = block.getElementsByTagName("a");
	var location = anchors[0].textContent;
	
	// add additional location info
	var reArrond = new RegExp("(\\d)+e","i");
	if(reArrond.test(location))
		location += " arrondissement";
	location += ", France";

	if (m != null) 
	    return m[0]+", "+location;
	else
		return location;			

	
}

// parse all "annonce_resume" blocks
var blocks = document.getElementsByClassName("annonce_resume");
for(var ix=0; ix<blocks.length; ix++)
{
	if(debug) GM_log("Found "+blocks[ix].id);

	// extract location
	var location = getAddress(blocks[ix]);
	if(debug) GM_log( "address:" + location );

	// add map link
	createMap(blocks[ix], location);
}