Report abuse

// ==UserScript==
// @name                Hello Reco
// @namespace	        http://www.dpg.se/test
// @description	        Shows nearby Gowalla and Foursquare venues to a company on Reco.se.
// @include		http://reco.se/*
// @include		http://www.reco.se/*
// @exclude		http://www.reco.se/questions/*
// @exclude		http://www.reco.se/friends/*
// @exclude		http://www.reco.se/myprofile/*
// @exclude		http://www.reco.se/objectPage/*
// @exclude		http://www.reco.se/*.seam
// ==/UserScript==	

if(typeof(GM_getValue("Gowalla API key")) == 'undefined') {
   var GW_API_key = prompt('Your Gowalla API key','');
   GM_setValue('Gowalla API key', GW_API_key);
} else {
   GM_log('Gowalla API key is ' +  GM_getValue("Gowalla API key"));
}

/// The following part is a translated version of Ivo Ugrina's PHP code for Jaro-Winkler string distance
/// Published on http://www.iugrina.com/files/JaroWinkler/JaroWinkler.phps

/*
version 1.2

  Copyright (c) 2005-2009  Ivo Ugrina <ivo@iugrina.com>

  A PHP library implementing Jaro and Jaro-Winkler
  distance, measuring similarity between strings.

  Theoretical stuff can be found in:
  Winkler, W. E. (1999). "The state of record linkage and current
  research problems". Statistics of Income Division, Internal Revenue
  Service Publication R99/04. http://www.census.gov/srd/papers/pdf/rr99-04.pdf.


  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 3 of the License, or (at
  your option) any later version.

  This program is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  General Public License for more details.
  
  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.

  ===

  A big thanks goes out to Pierre Senellart <pierre@senellart.com>
  for finding a small bug in code.
*/

Array.min = function( array ){
    return Math.min.apply( Math, array );
};

String.prototype.reverse=function(){return this.split("").reverse().join("");}

function getCommonCharacters( string1, string2, allowedDistance ){
  var i,j;
  str1_len = string1.length;
  str2_len = string2.length;
  temp_string2 = string2;
   
  commonCharacters='';

  for( i=0; i < str1_len; i++){
    
    noMatch = true;

    // compare if char does match inside given allowedDistance
    // and if it does add it to commonCharacters
    for( j= Math.max( 0, i-allowedDistance ); noMatch && j < Math.min( i + allowedDistance + 1, str2_len ); j++){
      if( temp_string2[j] == string1[i] ){
        noMatch = false;

    commonCharacters += string1[i];

    temp_string2[j] = '';
      }
    }
  }

  return commonCharacters;
}
  
function Jaro( string1, string2 ){
  var i;
    
  str1_len = string1.length;
  str2_len = string2.length;
    
  // theoretical distance
  distance = Math.floor(Math.min( str1_len, str2_len ) / 2.0); 
    
  // get common characters
  commons1 = getCommonCharacters( string1, string2, distance );
  commons2 = getCommonCharacters( string2, string1, distance );
    
  if( (commons1_len =  commons1.length) == 0) return 0;
  if( (commons2_len =  commons2.length) == 0) return 0;

  // calculate transpositions
  transpositions = 0;
  upperBound = Math.min( commons1_len, commons2_len );
  for( i = 0; i < upperBound; i++){
    if( commons1[i] != commons2[i] ) transpositions++;
  }
  transpositions /= 2.0;

  // return the Jaro distance
  return (commons1_len/(str1_len) + commons2_len/(str2_len) + (commons1_len - transpositions)/(commons1_len)) / 3.0;
    
}
 
function getPrefixLength( string1, string2, MINPREFIXLENGTH){
  var i;
  MINPREFIXLENGTH = typeof(MINPREFIXLENGTH) != 'undefined' ? MINPREFIXLENGTH : 4;
  
  n = Array.min(  [MINPREFIXLENGTH, string1.length, string2.length]);
  
  for(i = 0; i < n; i++){
    if( string1[i] != string2[i] ){
      // return index of first occurrence of different characters 
      return i;
    }
  }

  // first n characters are the same   
  return n;
}
  
function JaroWinkler(string1, string2, PREFIXSCALE){

  PREFIXSCALE = typeof(PREFIXSCALE) != 'undefined' ? PREFIXSCALE : 0.1;

  
  JaroDistance = Jaro( string1, string2 );
  
  prefixLength = getPrefixLength( string1, string2 );
  
  return JaroDistance + prefixLength * PREFIXSCALE * (1.0 - JaroDistance);
}

/// End of Jaro-Winkler string distance function

var scriptPart = document.evaluate( '//script[contains(.,"vCLat")]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue;
if(scriptPart != null) {
var scriptPartString = scriptPart.textContent;  
var lat = scriptPartString.substring(scriptPartString.indexOf("var vCLat ")+13,scriptPartString.indexOf("';",scriptPartString.indexOf("var vCLat ")));
var lon = scriptPartString.substring(scriptPartString.indexOf("var vCLon ")+13,scriptPartString.indexOf("';",scriptPartString.indexOf("var vCLon ")));
var name = scriptPartString.substring(scriptPartString.indexOf("var vCName ")+13,scriptPartString.indexOf("';",scriptPartString.indexOf("var vCName ")));

if(lat.length > 0 && lon.length > 0) {gowalla(lat, lon); foursquare(lat,lon);}
var elmFoo = document.getElementById('companyPictures');
var statusBox = document.createElement('div');
statusBox.innerHTML = '<div id="gowallaStatusBox" class="dataBoxNew"><div class="header"><div class="leftTopCorner"></div><div class="rightTopCorner"></div><h2>Närliggande inloggningar</h2></div><div class="content clearfix"><div class="load"></div><div id="gowallaInfo"></div><div id="foursquareInfo"></div></div><div class="footer"><div class="leftCorner"></div><div class="rightCorner"></div></div></div>';
elmFoo.parentNode.insertBefore(statusBox, elmFoo);
var elmGow = document.getElementById('gowallaInfo');
elmGow.innerHTML = 'Kontaktar Gowalla...';
var elmFsq = document.getElementById('foursquareInfo');
elmFsq.innerHTML = 'Kontaktar Foursquare...';
}

function foursquare(lat, lon) {
  GM_xmlhttpRequest ({
    method: "GET",
    url: "http://api.foursquare.com/v1/venues.json?geolat="+lat+"&geolong="+lon,
    headers: {
	'Content-Type': 'application/json',
        'Accept': 'application/json',
	'User-Agent': 'Greasemonkey script Hello Reco',
    },
    onload: function(responseDetails) { 
	var result = eval('('+responseDetails.responseText+')');
        var list = '';

var maxe = [];

for(i=0;i<result["groups"][0]["venues"].length;i++) {
  var test = result.groups[0].venues[i].name+"";
  var sim = JaroWinkler(test, name);
  var bsim = JaroWinkler(test.reverse(), name.reverse());
  maxe[i] = sim + .8*bsim;
}
var sortedMaxe = maxe.slice(0);
sortedMaxe.sort().reverse();
threshold = sortedMaxe[5];
      for ( var i = 0; i<result.groups[0].venues.length; ++i ) {
	if(maxe[i]>threshold) {
	  var category;
if(result["groups"][0]["venues"][i]["primarycategory"]) {category = result["groups"][0]["venues"][i]["primarycategory"]["nodename"];} else {category = ''} 
	list += '<a href="http://foursquare.com/venue/'+result["groups"][0]["venues"][i]["id"]+'" title="'+result["groups"][0]["venues"][i]["address"]+', '+category+'">'+result["groups"][0]["venues"][i]["name"]+' [4]</a>';
	}
	}
	elmFsq.innerHTML = list;
	
    },
    onreadystatechange: function(responseDetails) {
    },
    onerror: function(responseDetails) {
      console.debug(responseDetails);
alert('Error');
    }
  });


}

function gowalla(lat, lon) {
GM_log("http://api.gowalla.com/spots?lat="+lat+"&lng="+lon+"&radius=50");
  GM_xmlhttpRequest ({
    method: "GET",
    url: "http://api.gowalla.com/spots?lat="+lat+"&lng="+lon+"&radius=50",
    headers: {
        'X-Gowalla-API-Key': GM_getValue('Gowalla API key'),
	'Content-Type': 'application/json',
        'Accept': 'application/json',
	'User-Agent': 'Greasemonkey script Hello Reco',
    },
    onload: function(responseDetails) { 
	var result = eval('('+responseDetails.responseText+')');
        var list = '';

var maxe = [];

for(i=0;i<result["spots"].length;i++) {
  var test = result.spots[i].name+"";
  var sim = JaroWinkler(test, name);
  var bsim = JaroWinkler(test.reverse(), name.reverse());
  maxe[i] = sim + .8*bsim;
}
var sortedMaxe = maxe.slice(0);
sortedMaxe.sort().reverse();
threshold = sortedMaxe[5];
      for ( var i = 0; i<result.spots.length; ++i ) {
	if(maxe[i]>threshold) {
	  var category;
	if(result["spots"][i]["spot_categories"][0]) {category = result["spots"][i]["spot_categories"][0]["name"];} else {category = ''} 

	list += '<a href="http://gowalla.com'+result["spots"][i]["url"]+'" title="'+category+'">'+result["spots"][i]["name"]+' [G]</a>';
	}
	}
	elmGow.innerHTML = list;
	
    },
    onreadystatechange: function(responseDetails) {
    },
    onerror: function(responseDetails) {
      console.debug(responseDetails);
alert('Error');
    }
  });

}