Created
October 13, 2011 22:11
-
-
Save yohman/1285695 to your computer and use it in GitHub Desktop.
Tweemo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<title>Twitter Smash</title> | |
<script type="text/javascript" src="http://mbostock.github.com/d3/d3.js?1.29.1"></script> | |
<script type="text/javascript" src="http://mbostock.github.com/d3/d3.geom.js?1.29.1"></script> | |
<script type="text/javascript" src="http://mbostock.github.com/d3/d3.layout.js?1.29.1"></script> | |
<script src="http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places" type="text/javascript"></script> | |
<link href='http://fonts.googleapis.com/css?family=Ubuntu:500' rel='stylesheet' type='text/css'> | |
<link href="http://jqueryui.com/themes/base/jquery.ui.all.css" type="text/css" rel="stylesheet" /> | |
<link href="style.css" type="text/css" rel="stylesheet" /> | |
<script src="https://www.google.com/jsapi?key=ABQIAAAAtHf2Vbojx_f9l2digk62nRR721nvlaDHrh7xkOtCxSM-c80RpRRMoUR4qEAqmJpECcqpdsdEs7YdIw" type="text/javascript"></script> | |
<script language="Javascript" type="text/javascript"> | |
//Load libraries | |
google.load("jquery", "1.6.2"); | |
google.load("jqueryui", "1.8.16"); | |
</script> | |
<style type="text/css"> | |
body { | |
background:black; | |
overflow: hidden; | |
margin: 0; | |
font: 14px "Ubuntu", sans-serif; | |
} | |
svg { | |
background:#efefef; | |
position:absolute; | |
top:0px; | |
z-index:0; | |
} | |
.popup { | |
background:white; | |
border:1px solid gainsboro; | |
padding:5px; | |
min-width: 150px; | |
} | |
rect { | |
fill: none; | |
pointer-events: all; | |
} | |
line { | |
stroke: #000; | |
stroke-width: 1.5px; | |
} | |
.string, .regexp { | |
color: #f39; | |
} | |
.keyword { | |
color: #00c; | |
} | |
.comment { | |
color: #555; | |
} | |
.number { | |
color: #369; | |
} | |
.class, .special { | |
color: #1181B8; | |
} | |
path.link { | |
fill: none; | |
stroke:#999; | |
stroke-width: 2px; | |
} | |
marker#licensing { | |
fill: lightgreen; | |
} | |
path.link.licensing { | |
stroke: lightgreen; | |
} | |
path.link.resolved { | |
stroke-dasharray: 0,2 1; | |
} | |
circle { | |
fill: #ccc; | |
stroke: #333; | |
opacity: 0.8; | |
} | |
text { | |
font:10px Tahoma, Geneva, sans-serif; | |
pointer-events: none; | |
} | |
text.shadow { | |
stroke: #fff; | |
stroke-width: 3px; | |
} | |
.link { | |
stroke: #ccc; | |
} | |
.nodetext { | |
pointer-events: none; | |
font: 10px sans-serif; | |
color: white; | |
stroke: #ccc; | |
} | |
</style> | |
<script type="text/javascript"> | |
/* =============================================================================== ** | |
jQuery UI | |
** =============================================================================== */ | |
var emotions = ['angry','fear','happy','like','nervous','relief','sad','shame','surprise','unpleasant']; | |
var days = ['3.11','3.12','3.13','3.14','3.15','3.16','3.17','3.18','3.19','3.20','3.21','3.22','3.23','3.24','3.25','3.26','3.27','3.28','3.29','3.30','3.31','4.01','4.02','4.03','4.04','4.05','4.06','4.07','4.08','4.09','4.10']; | |
var records = 50; | |
var day = days[0]; | |
/** | |
* | |
* credits for this plugin go to brandonaaron.net | |
* | |
* unfortunately his site is down | |
* | |
* @param {Object} up | |
* @param {Object} down | |
* @param {Object} preventDefault | |
*/ | |
jQuery.fn.extend({ | |
mousewheel: function(up, down, preventDefault) { | |
return this.hover( | |
function() { | |
jQuery.event.mousewheel.giveFocus(this, up, down, preventDefault); | |
}, | |
function() { | |
jQuery.event.mousewheel.removeFocus(this); | |
} | |
); | |
}, | |
mousewheeldown: function(fn, preventDefault) { | |
return this.mousewheel(function(){}, fn, preventDefault); | |
}, | |
mousewheelup: function(fn, preventDefault) { | |
return this.mousewheel(fn, function(){}, preventDefault); | |
}, | |
unmousewheel: function() { | |
return this.each(function() { | |
jQuery(this).unmouseover().unmouseout(); | |
jQuery.event.mousewheel.removeFocus(this); | |
}); | |
}, | |
unmousewheeldown: jQuery.fn.unmousewheel, | |
unmousewheelup: jQuery.fn.unmousewheel | |
}); | |
jQuery.event.mousewheel = { | |
giveFocus: function(el, up, down, preventDefault) { | |
if (el._handleMousewheel) jQuery(el).unmousewheel(); | |
if (preventDefault == window.undefined && down && down.constructor != Function) { | |
preventDefault = down; | |
down = null; | |
} | |
el._handleMousewheel = function(event) { | |
if (!event) event = window.event; | |
if (preventDefault) | |
if (event.preventDefault) event.preventDefault(); | |
else event.returnValue = false; | |
var delta = 0; | |
if (event.wheelDelta) { | |
delta = event.wheelDelta/120; | |
if (window.opera) delta = -delta; | |
} else if (event.detail) { | |
delta = -event.detail/3; | |
} | |
if (up && (delta > 0 || !down)) | |
up.apply(el, [event, delta]); | |
else if (down && delta < 0) | |
down.apply(el, [event, delta]); | |
}; | |
if (window.addEventListener) | |
window.addEventListener('DOMMouseScroll', el._handleMousewheel, false); | |
window.onmousewheel = document.onmousewheel = el._handleMousewheel; | |
}, | |
removeFocus: function(el) { | |
if (!el._handleMousewheel) return; | |
if (window.removeEventListener) | |
window.removeEventListener('DOMMouseScroll', el._handleMousewheel, false); | |
window.onmousewheel = document.onmousewheel = null; | |
el._handleMousewheel = null; | |
} | |
}; | |
$(document).ready(function() { | |
$(document).mousemove(function(e){ | |
$('#popup').css('left', e.pageX+10); | |
$('#popup').css('top', e.pageY-30); | |
//$('#popup').css('padding', '5px'); | |
}); | |
$(window).resize(function() { | |
resize(); | |
}); | |
//allow pressing "enter" | |
$('#search').keypress(function(e) { | |
if(e.which == 13) { | |
getTweemoData($('#search').val()); | |
} | |
}); | |
$("body").mousewheel(function(i,intDelta){ | |
if (intDelta > 0 ) explode(); | |
if (intDelta < 0 ) implode(); | |
}); | |
}); | |
$(function() { | |
$("#dialog").dialog({modal:true, height:400, width: 600, autoOpen:false}); | |
$( "#slider" ).slider({ | |
value:0, | |
min: 0, | |
max: (days.length-1), | |
step: 1, | |
slide: function( event, ui ) { | |
$('#search-big-display').html(days[ui.value]) | |
getSendaiData(records,days[ui.value]) | |
} | |
}); | |
$( "#amount" ).val( "$" + $( "#slider" ).slider( "value" ) ); | |
}); | |
$.extend({ | |
getUrlVars: function(){ | |
var vars = [], hash; | |
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); | |
for(var i = 0; i < hashes.length; i++) | |
{ | |
hash = hashes[i].split('='); | |
vars.push(hash[0]); | |
vars[hash[0]] = hash[1]; | |
} | |
return vars; | |
}, | |
getUrlVar: function(name){ | |
return $.getUrlVars()[name]; | |
} | |
}); | |
/* =============================================================================== ** | |
Init | |
** =============================================================================== */ | |
function init() | |
{ | |
color = d3.scale.category10(); | |
force = d3.layout.force() | |
.gravity(0) | |
.distance(100) | |
.charge(-20) | |
.friction(1.05) | |
.size([w, h]); | |
nodes = force.nodes(), | |
links = force.links(); | |
$.each(emotions,function(i,val){ | |
nodes.push({type: i, x: ((i+1) * 2 * w / (emotions.length*2))-(w / (emotions.length*2)), y: h, fixed: true, name:val, id: val, connections: 0}); | |
// if(i < 5) | |
// { | |
// nodes.push({type: i, x: (i+1) * w / 6, y: 2 * h / 6, fixed: true, name:val, id: val, connections: 200}); | |
// } | |
// else | |
// { | |
// nodes.push({type: i, x: (i-4) * w / 6, y: 4 * h / 6, fixed: true, name:val, id: val, connections: 200}); | |
// } | |
}) | |
vis = d3.select("body").append("svg:svg") | |
.attr("width", w) | |
.attr("height", h); | |
r = 6; | |
force.on("tick", function(e) { | |
vis.selectAll("circle.node") | |
//.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }); | |
//keep in bounds | |
.attr("cx", function(d) { return d.x = Math.max(r, Math.min(w - r, d.x)); }) | |
.attr("cy", function(d) { return d.y = Math.max(r, Math.min(h - r, d.y)); }); | |
vis.selectAll("text") | |
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }); | |
vis.selectAll("line.link") | |
.attr("x1", function(d) { return d.source.x; }) | |
.attr("y1", function(d) { return d.source.y; }) | |
.attr("x2", function(d) { return d.target.x; }) | |
.attr("y2", function(d) { return d.target.y; }); | |
//Gravity pull towards each emotion bubble | |
// nodes.forEach(function(node) { | |
// var k = e.alpha * .1; | |
// var center = nodes[node.type]; | |
// node.x += (center.x - node.x) * k; | |
// node.y += (center.y - node.y) * k; | |
// }); | |
}); | |
restart(); | |
//if q is defined in url, go straight to getting data | |
var q = $.getUrlVar('q'); | |
if(typeof q !== 'undefined') | |
{ | |
//setInterval("getTweemoData('"+q+"')",5000); | |
getTweemoData(q); | |
} | |
} | |
/* =============================================================================== ** | |
Restart | |
** =============================================================================== */ | |
function hex2rgb(hexStr){ | |
// note: hexStr should be #rrggbb | |
var hex = parseInt(hexStr.substring(1), 16); | |
var r = (hex & 0xff0000) >> 16; | |
var g = (hex & 0x00ff00) >> 8; | |
var b = hex & 0x0000ff; | |
return 'rgba('+r+','+g+','+b+',0.1)'; | |
} | |
function restart() { | |
var link = vis.selectAll("line.link") | |
.data(links, function(d) { return d.source.id + "-" + d.target.id; }); | |
link.enter().insert("svg:line", "circle.node") | |
.attr("class", "link"); | |
link.exit().remove(); | |
var node = vis.selectAll("circle.node") | |
.data(d3.values(nodes), function(d) { return d.id;}); | |
var nodeEnter = node.enter().append("svg:circle") | |
.attr("class", "node") | |
.call(force.drag); | |
//animate circle sizing | |
node | |
.transition() | |
.duration(1000) | |
.delay(0) | |
.attr("r", function(d){ | |
return (Math.sqrt(d.connections)*8); | |
}) | |
// node | |
// .transition(function(d){console.log('transitioning')}) | |
// .delay(3000) | |
// .attr("r", 1e-6) | |
// .each("end", function(d) { | |
// if(d.fixed) | |
// { | |
// } | |
// else | |
// { | |
// force.nodes().shift(); | |
// } | |
// }) | |
// .remove(); | |
node | |
.style("fill", function(d) { | |
if(d.fixed) | |
{ | |
// return hex2rgb(color(d.type)) | |
return color(d.type); | |
} | |
else | |
{ | |
return color(d.type); | |
} | |
}) | |
.style("stroke", function(d){ | |
if(d.fixed) | |
{ | |
return hex2rgb(color(d.type)); | |
} | |
else | |
{ | |
return hex2rgb(color(d.type)); | |
// return "#fff"; | |
} | |
}) | |
.style("stroke-width", function(d){ | |
if(d.fixed) | |
{ | |
return 0; | |
} | |
else | |
{ | |
return 2; | |
} | |
}) | |
.on("mouseover", function(d) { | |
if(d.fixed) | |
{ | |
showThumb(d,d.tweet) | |
} | |
}) | |
// .on("click", function(d){ | |
// node | |
// .transition() | |
// .duration(500) | |
// .delay(0) | |
// .attr("r", function(d){ | |
// return (Math.sqrt(d.connections)); | |
// }) | |
// }) | |
// .on("click", function(d) { | |
// if(d.type !=='target')findTwitterUser(d.name,d,d.type); | |
// getLiveData(d.name); | |
// }) | |
.on("mouseout", function() { | |
$('#popup').hide(); | |
$('#popup').html(''); | |
}) | |
vis.selectAll("text") | |
.data(d3.values(nodes)) | |
.enter() | |
.append("svg:text") | |
.attr("class", "nodetext") | |
.attr("dx", 12) | |
.attr("dy", ".35em") | |
.text(function(d) { return d.name }); | |
node.exit().remove(); | |
force.start(); | |
} | |
/* =============================================================================== ** | |
Globals | |
** =============================================================================== */ | |
var w,h,force,nodes,links,vis; | |
var w = $(window).width(), | |
h = $(window).height(); | |
var livecounter = 0; | |
var next_page = ''; | |
var refresh_url = ''; | |
var q = ''; | |
var blackholeindex; | |
var refresh = false; | |
var nodes = []; | |
var links = []; | |
var tweetids = []; | |
var newnodes = []; | |
var nodeids = []; | |
var newnodeids = []; | |
var tweemos = []; | |
/* =============================================================================== ** | |
Get Tweemo's | |
** =============================================================================== */ | |
var emotions = ['EMOTIONS:AFFECTION','EMOTIONS:GLORY','EMOTIONS:EXPRESSIVE BEHAVIOR','EMOTIONS:SADNESS','EMOTIONS:AGGRESSION','EMOTIONS:POSITIVE AFFECT','EMOTIONS:ANXIETY']; | |
var timer; | |
function getTweemoData(q) | |
{ | |
console.log('getting tweemos...') | |
$('#search-big-display').html(q) | |
$('#map_canvas').fadeOut(); | |
q = q; | |
var url = 'http://otterhound.ats.ucla.edu/~dave/hcnow/trunk/tweemo/tweemo.py/analyze?keyword='+q; | |
$.getJSON(url, function(data) | |
{ | |
console.log(data) | |
// | |
$.each(data.summary,function(i,val){ | |
// console.log(val) | |
$.each(emotions,function(h,emo){ | |
console.log(val[emo]) | |
if(typeof val[emo] !== 'undefined') | |
{ | |
nodes[$.inArray(emo, emotions)].count = val[emo].length; | |
nodes[$.inArray(emo, emotions)].connections = val[emo].length*50; | |
} | |
}) | |
}) | |
$.each(data.tweets,function(i,val){ | |
var emotioncounter = 0; | |
$.each(emotions,function(h,emo){ | |
if(typeof val.category_count[emo] !== 'undefined') | |
{ | |
emotioncounter++; | |
var words = val.category_words[emo] | |
if($.inArray(val.id,nodeids) == -1) | |
{ | |
var node = | |
{ | |
name: words[0], | |
id: val.id, | |
tweet: val.tweet, | |
type: $.inArray(emo, emotions), | |
connections:parseInt(val.category_count[emo]) | |
} | |
nodes.push(node); | |
nodeids.push(val.id) | |
} | |
} | |
//last record | |
if(h == emotions.length-1) | |
{ | |
if(emotioncounter == 0) | |
{ | |
var node = | |
{ | |
name: '', | |
id: val.id, | |
tweet: val.tweet, | |
type: 0, | |
connections:1 | |
} | |
//nodes.push(node); | |
//nodeids.push(val.id) | |
} | |
} | |
}) | |
if(i == data.tweets.length-1) | |
{ | |
restart(); | |
//run every 10 seconds! | |
} | |
});//end .each | |
});//end getjson | |
} | |
/* =============================================================================== ** | |
Get Sendai Data | |
** =============================================================================== */ | |
function getSendaiData(records,thisday) | |
{ | |
day = thisday; | |
newnodeids.length=0; | |
$('#search-big-display').html(day) | |
$('#map_canvas').fadeOut(); | |
q = q; | |
livecounter = 0; | |
if(typeof records == 'undefined') records = 20; | |
if(typeof day == 'undefined') day = 3.11; | |
var url = 'http://otterhound.ats.ucla.edu/~yohman/smash/json/json_sendai.php?records='+records+'&day='+day; | |
livecounter++; | |
$.getJSON(url, function(data) | |
{ | |
$( "#slider" ).slider( "option", "value", $.inArray(day,days)); | |
$.each(data.result,function(i,val){ | |
//if node exists, append the tweet | |
var nodeexists = false; | |
$.each(nodes,function(i,val2){ | |
//if node exists, just change the total | |
if(val2.id == val.target) | |
{ | |
nodeexists = true; | |
nodes[i].connections = parseInt(val.total); | |
} | |
//last record | |
if(i == (nodes.length-1)) | |
{ | |
//create node if it does not exist | |
if(!nodeexists) | |
{ | |
var node = | |
{ | |
name: val.target, | |
id: val.target, | |
type: $.inArray(val.emotion, emotions), | |
tweets: [val], | |
connections:parseInt(val.total) | |
} | |
nodes.push(node); | |
nodeids.push(val.target); | |
} | |
} | |
}); | |
newnodeids.push(val.target); | |
//last record | |
if(i == (data.result.length-1)) | |
{ | |
//Delete any nodes that do not exist in new search | |
var deleteus = []; | |
$.each(nodeids,function(i,val){ | |
//if node is not found in the new batch of nodes | |
if($.inArray(nodeids[i],newnodeids) < 0){ | |
deleteus.push(nodeids[i]) | |
}//end if | |
//last record | |
if(i == (nodeids.length-1)) | |
{ | |
$.each(deleteus,function(i,delid){ | |
nodeids.splice($.inArray(delid,nodeids),1); | |
for(i=0;i<nodes.length;i++){ | |
if(nodes[i].id == delid) nodes.splice(i,1); | |
} | |
}) | |
} | |
})//end each | |
restart(); | |
} | |
});//end .each | |
});//end getjson | |
} | |
/* =============================================================================== ** | |
Get tweets | |
** =============================================================================== */ | |
function getLiveData(q,refresh) | |
{ | |
$('#map_canvas').fadeOut(); | |
q = q; | |
livecounter = 0; | |
if(livecounter == 0) | |
{ | |
var url = 'http://search.twitter.com/search.json?callback=?&rpp=100&q='+q; | |
if(typeof lat !== 'undefined') | |
{ | |
//geocode it, and then get the lat/lon | |
url += '&geocode='+lat+','+lng+','+$("#searchradius").val(); | |
$('#search-big-display').append(' ' +loc); | |
} | |
} | |
else | |
{ | |
var url = 'http://search.twitter.com/search.json'+url+'&callback=?'; | |
} | |
livecounter++; | |
$.getJSON(url, function(data) | |
{ | |
if(data.results.length == 0) | |
{ | |
if(livecounter == 1) | |
{ | |
livecounter = 0; | |
alert('no results found'); | |
return false; | |
} | |
else | |
{ | |
//drawD3(); | |
} | |
} | |
next_page = data.next_page; | |
refresh_url = data.refresh_url; | |
$.each(data.results,function(i,val){ | |
//Only do anything if this tweet has never been accessed | |
if($.inArray(val.id,tweetids) == -1) | |
{ | |
tweetids.push(val.id); | |
//if node exists, append the tweet | |
var tonodeexists = false; | |
var fromnodeexists = false; | |
//if first ever node, create it: | |
if(nodes.length == 0) | |
{ | |
//source | |
var sourcenode = | |
{ | |
name: val.from_user, | |
id: val.from_user, | |
type: 0, | |
profile_image_url: val.profile_image_url, | |
tweets: [val], | |
connections: 1 | |
} | |
if(typeof val.to_user !== "undefined") | |
{ | |
sourcenode.type = 1; | |
} | |
nodes.push(sourcenode); | |
if(typeof val.to_user !== "undefined") | |
{ | |
sourcenode.type = 1; | |
var targetnode = | |
{ | |
name: val.from_user, | |
id: val.from_user, | |
type: 2, | |
tweets: [val], | |
connections: 1 | |
} | |
nodes.push(targetnode); | |
} | |
} | |
else | |
{ | |
$.each(nodes,function(i,val2){ | |
if(val2.id == val.from_user) | |
{ | |
fromnodeexists = true; | |
nodes[i].connections = nodes[i].connections+1; | |
nodes[i].tweets.push(val) | |
} | |
if(val2.id == val.to_user) | |
{ | |
tonodeexists = true; | |
nodes[i].connections = nodes[i].connections+1; | |
nodes[i].tweets.push(val) | |
} | |
//last record | |
if(i == (nodes.length-1)) | |
{ | |
if(!fromnodeexists) | |
{ | |
var sourcenode = | |
{ | |
name: val.from_user, | |
id: val.from_user, | |
type: 0, | |
profile_image_url: val.profile_image_url, | |
tweets: [val], | |
connections: 1 | |
} | |
if(typeof val.to_user !== "undefined") | |
{ | |
sourcenode.type = 1; | |
} | |
nodes.push(sourcenode); | |
} | |
if(!tonodeexists) | |
{ | |
if(typeof val.to_user !== "undefined") | |
{ | |
var targetnode = | |
{ | |
name: val.to_user, | |
id: val.to_user, | |
type: 2, | |
tweets: [val], | |
connections: 1 | |
} | |
nodes.push(targetnode); | |
} | |
} | |
} | |
}); | |
} | |
//Add Link | |
if(typeof val.to_user !== 'undefined') | |
{ | |
//create the link record | |
var link = {}; | |
link.tweetid = val.id; | |
link.source = findNodePos(val.from_user); | |
link.target = findNodePos(val.to_user); | |
link.type = 'suit'; | |
link.tweets = []; | |
link.tweets.push(val); | |
links.push(link); | |
} | |
restart(); | |
//last record | |
if(i == data.results.length-1) | |
{ | |
if(refresh) | |
{ | |
//restart(); | |
} | |
else | |
{ | |
//restart(); | |
} | |
return false; | |
//drawPV(); | |
if(nodes.length < 200) | |
{ | |
if(typeof next_page == "undefined") | |
{ | |
//drawD3(); | |
} | |
else | |
{ | |
//getLiveData(q,next_page); | |
} | |
} | |
else | |
{ | |
//drawD3(); | |
//drawPV(); | |
} | |
} | |
} | |
});//end .each | |
}); | |
} | |
function findNodePos(element) | |
{ | |
var foundin = 0; | |
$.each(nodes,function(i,val){ | |
if (val.id == element) | |
{ | |
foundin = i; | |
} | |
}); | |
return foundin; | |
} | |
/* =============================================================================== ** | |
Display stuff | |
** =============================================================================== */ | |
function showThumb(d,tweet) | |
{ | |
console.log(d) | |
if(typeof tweet == 'undefined'){ | |
var box = '<table cellpadding="2"><tr><td colspan=2><span class="connections">'+d.count+'</span><br><span class="fieldname">connections</span></td></tr>'; | |
box += '<tr><td align="right"><span class="fieldname">Emotion </span></td><td>'+d.name+'</a></td></tr>'; | |
// box += '<tr><td align="right"><span class="fieldname">type </span></td><td>'+dtype+'</td></tr>'; | |
box += '</table>'; | |
} | |
else | |
{ | |
var box = '<table cellpadding="2"><tr><td><img src="'+tweet.profile_image_url+'"></td><td align="center"><span class="connections">'+tweet.connections+'</span><br><span class="fieldname">connections</span></td></tr>'; | |
box += '<tr><td align="right"><span class="fieldname">twitter </span></td><td><a target="_blank" href="https://twitter.com/#!/'+tweet.from_user+'">'+tweet.from_user+'</a></td></tr>'; | |
// box += '<tr><td align="right"><span class="fieldname">type </span></td><td>'+tweet.type+'</td></tr>'; | |
box += '</table>'; | |
box += '<div class="tweet"><span class="time">'+tweet.created_at+'</span><br>'+tweet.text+'</div>'; | |
} | |
$('#popup').fadeIn(); | |
$('#popup').html('<div class="popup">'+box+'</div>'); | |
} | |
var type = ''; | |
function findTwitterUser(id,d,type) | |
{ | |
$('#sidepanel').fadeOut(); | |
$('#sidepanel').fadeIn('slow'); | |
resize(); | |
var box = '<table cellpadding="2"><tr><td><img src="'+d.profile_image_url+'"></td><td align="center"><span class="connections">'+d.connections+'</span><br><span class="fieldname">connections</span></td></tr>'; | |
box += '<tr><td align="right"><span class="fieldname">twitter </span></td><td><a target="_blank" href="https://twitter.com/#!/'+d.id+'">'+d.name+'</a></td></tr>'; | |
box += '<tr><td align="right"><span class="fieldname">type </span></td><td>'+d.type+'</td></tr>'; | |
box += '</table>'; | |
$.each(d.tweets,function(i,val){ | |
box += '<div class="tweet"><span class="time">'+val.created_at+'</span><br>'+val.text+'</div>'; | |
}); | |
$('#sidepanel').html(box); | |
/* | |
if(type == 'source') | |
{ | |
var url = 'https://api.twitter.com/1/users/lookup.json?callback=?&screen_name='+id; | |
} | |
else | |
{ | |
var url = 'https://api.twitter.com/1/users/lookup.json?callback=?&screen_name='+id; | |
//var url = 'https://api.twitter.com/1/users/lookup.json?callback=?&user_id='+id; | |
} | |
$.getJSON(url, function(data) | |
{ | |
var box = '<table cellpadding="2"><tr><td><img src="'+data[0].profile_image_url+'"></td><td align="center"><span class="connections">'+(d.connections)+'</span><br><span class="fieldname">connections</span></td></tr>'; | |
box += '<tr><td align="right"><span class="fieldname">name </span></td><td>'+data[0].name+'</td></tr>'; | |
box += '<tr><td align="right"><span class="fieldname">location </span></td><td>'+data[0].location+'</td></tr>'; | |
box += '<tr><td align="right"><span class="fieldname">twitter </span></td><td><a href="https://twitter.com/#!/'+data[0].screen_name+'">'+data[0].screen_name+'</td></tr>'; | |
box += '<tr><td align="right"><span class="fieldname">twitter </span></td><td><a href="?q='+data[0].screen_name+'">view connections</a></td></tr>'; | |
box += '</table>'; | |
$.each(d.tweets,function(i,val){ | |
box += '<div class="tweet"><span class="time">'+val.created_at+'</span><br>'+val.text+'</div>'; | |
}); | |
$('#sidepanel').html(box); | |
}); | |
*/ | |
} | |
function getTwitterName(id,d) | |
{ | |
var url = 'https://api.twitter.com/1/users/lookup.json?callback=?&user_id='+id; | |
$.getJSON(url, function(data) | |
{ | |
return data[0].name; | |
}); | |
} | |
/* =============================================================================== ** | |
Redraw | |
** =============================================================================== */ | |
function resize() | |
{ | |
var h = $(window).height(); | |
var w = $(window).width(); | |
//svg window | |
//svg.attr("width",w); | |
//svg.attr("height",h); | |
//side panel | |
h = h - 145; | |
$('#sidepanel').height(h); | |
} | |
/* =============================================================================== ** | |
Controls | |
** =============================================================================== */ | |
function explode() | |
{ | |
force.charge(force.charge()-10);force.start(); | |
} | |
function implode() | |
{ | |
var value = force.charge()+10; | |
if(value > 50) value = 50; | |
force.charge(value);force.start(); | |
} | |
function gravityUp() | |
{ | |
var value = force.gravity()+0.01; | |
if(value > 1) value = 1; | |
force.gravity(value);force.start(); | |
} | |
function gravityDown() | |
{ | |
var value = force.gravity()-0.01; | |
if(value < 0) value = 0; | |
force.gravity(value);force.start(); | |
} | |
function next() | |
{ | |
if($.inArray(day,days) < days.length) | |
{ | |
getSendaiData(records,days[($.inArray(day,days)+1)]) | |
} | |
} | |
/* =============================================================================== ** | |
Google Maps Autocomplete | |
** =============================================================================== */ | |
var map,lat,lng, loc,searchradius; | |
function initialize() { | |
var mapOptions = { | |
center: new google.maps.LatLng(80,180), | |
zoom: 1, | |
mapTypeId: google.maps.MapTypeId.ROADMAP | |
}; | |
map = new google.maps.Map(document.getElementById('map_canvas'), | |
mapOptions); | |
var input = document.getElementById('searchTextField'); | |
var autocomplete = new google.maps.places.Autocomplete(input); | |
autocomplete.bindTo('bounds', map); | |
var infowindow = new google.maps.InfoWindow(); | |
var marker = new google.maps.Marker({ | |
map: map | |
}); | |
google.maps.event.addListener(autocomplete, 'place_changed', function() { | |
infowindow.close(); | |
var place = autocomplete.getPlace(); | |
lat = place.geometry.location.lat(); | |
lng = place.geometry.location.lng(); | |
loc = place.name; | |
if (place.geometry.viewport) { | |
map.fitBounds(place.geometry.viewport); | |
} else { | |
map.setCenter(place.geometry.location); | |
map.setZoom(17); // Why 17? Because it looks good. | |
} | |
var image = new google.maps.MarkerImage( | |
place.icon, | |
new google.maps.Size(71, 71), | |
new google.maps.Point(0, 0), | |
new google.maps.Point(17, 34), | |
new google.maps.Size(35, 35)); | |
marker.setIcon(image); | |
marker.setPosition(place.geometry.location); | |
var address = ''; | |
if (place.address_components) { | |
address = [(place.address_components[0] && | |
place.address_components[0].short_name || ''), | |
(place.address_components[1] && | |
place.address_components[1].short_name || ''), | |
(place.address_components[2] && | |
place.address_components[2].short_name || '') | |
].join(' '); | |
} | |
infowindow.setContent('<div><strong>' + place.name + '</strong><br>' + address); | |
//infowindow.open(map, marker); | |
}); | |
// Sets a listener on a radio button to change the filter type on Places | |
// Autocomplete. | |
function setupClickListener(id, types) { | |
var radioButton = document.getElementById(id); | |
google.maps.event.addDomListener(radioButton, 'click', function() { | |
autocomplete.setTypes(types); | |
}); | |
} | |
setupClickListener('changetype-all', []); | |
setupClickListener('changetype-establishment', ['establishment']); | |
setupClickListener('changetype-geocode', ['geocode']); | |
} | |
google.maps.event.addDomListener(window, 'load', initialize); | |
</script> | |
<body style="" onLoad="init()"> | |
<!-- | |
<div id="help" style="position:absolute;top:100px;margin:auto;width:400px;padding:10px;background:white;border:1px solid silver; z-index:11"> | |
<ol> | |
<li>Enter a search term or twitter username (ex. "<a href="javascript:void(0)" onClick="init('wayne rooney')">wayne rooney</a>", "barackobama")</li> | |
<li>Optionally... enter a location</li> | |
</ol> | |
<div style="margin:auto;width:50px;border:1px solid #555;padding:4px;">Let's get smashing</div> | |
</div> | |
<div id="fullscreen" style="z-index:10"></div> | |
--> | |
<div style="padding:5px;position:absolute;top:0px; text-align:center height:60px; background:#444; width:100%; z-index:1; opacity:0.9;"> | |
<table align="" cellpadding="0" cellspacing="0" border="0" style="margin:auto;"> | |
<tr> | |
<td width="250" valign="top" rowspan="2"> | |
<span style="padding:5px; font-size:32px;color:gainsboro;">Tweemo</span> | |
</td> | |
<td valign="top"> | |
<span style="padding:5px; font-size:12px;color:gainsboro;">What</span> | |
</td> | |
<td valign="top"> | |
<span style="padding:5px; font-size:12px;color:gainsboro;">Where (optional)</span> | |
</td> | |
<td valign="top"> | |
</td> | |
<td valign="top"> | |
</td> | |
</tr> | |
<tr> | |
<td valign="top"> | |
<input type="text" id="search" class="search" value=""> | |
</td> | |
<td valign="top"> | |
<input id="searchTextField" class="search" style="width:300px;" type="text" onFocus="$('#map_canvas').fadeIn();google.maps.event.trigger(map, 'resize') "> | |
<div id="map_canvas" style="width:300px;height:300px; display:none;"></div> | |
</td> | |
<td valign="top"> | |
<select id="searchradius"> | |
<option value="10mi" selected>10 mile radius</option> | |
<option value="50mi">50 mile radius</option> | |
<option value="100mi">100 mile radius</option> | |
</select> | |
</td> | |
<td valign="top"> | |
<input value="smash it" class="" type="submit" onClick="getTweemoData($('#search').val())"> | |
</td> | |
</tr> | |
</table> | |
</div> | |
<!-- | |
Copyright | |
--> | |
<div style="position:absolute;bottom:10px;right:10px;color:#818181;display:block;z-index:2" id="copy"><a href="http://gis.yohman.com" target="_blank">yohman</a> © 2011</div> | |
<!-- | |
Time Slider | |
--> | |
<div id="search-big-display" style="position:absolute;bottom:10px;left:10px;color:#818181;display:block;z-index:2"></div> | |
<!-- <div id="next" style="position:absolute;bottom:10px;left:300px;color:#818181;display:block;z-index:100;font-size: 140px;cursor:pointer" onclick="next()">></div> | |
<div id="slider" style="z-index:100;width:250px;bottom:10px;left:10px;position: absolute;"></div>--> | |
<!-- | |
Side panel for tweet display | |
--> | |
<div id="sidepanel" style="z-index:100;"></div> | |
<div id="displaydivs" style="display:none"> | |
<!-- | |
Gravity | |
--> | |
<div id="gravitycontrols" class="round" style="position:absolute; top:20px; left:15px; cursor:pointer; width:45px; height:110px; background:gainsboro;"> | |
<div id="explode" style="position:relative; top:10px; left:9px; cursor:pointer;" onClick="gravityUp()"><img src="http://cdn1.iconfinder.com/data/icons/iphone_toolbar_icons/iphone_toolbar_icons/plus.png"></div> | |
<div id="explode" style="position:relative; top:32px; left:9px; cursor:pointer;" onClick="gravityDown()"><img src="http://cdn1.iconfinder.com/data/icons/iphone_toolbar_icons/iphone_toolbar_icons/minus.png"></div> | |
<div style="position:relative; top:40px; left:8px;"><span style="font-size:9px">gravity</span></div> | |
</div> | |
<!-- | |
Charge in out | |
--> | |
<div id="chargecontrols" class="round" style="position:absolute; top:140px; left:15px; cursor:pointer; width:45px; height:110px; background:gainsboro;"> | |
<div id="explode" style="position:relative; top:10px; left:9px; cursor:pointer;" onClick="explode()"><img src="http://cdn1.iconfinder.com/data/icons/iphone_toolbar_icons/iphone_toolbar_icons/plus.png"></div> | |
<div id="explode" style="position:relative; top:32px; left:9px; cursor:pointer;" onClick="implode()"><img src="http://cdn1.iconfinder.com/data/icons/iphone_toolbar_icons/iphone_toolbar_icons/minus.png"></div> | |
<div style="position:relative; top:40px; left:10px;"><span style="font-size:9px">charge</span></div> | |
</div> | |
</div> | |
<!-- | |
Popup | |
--> | |
<div id="popup" style=""></div> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
path.link { | |
fill: none; | |
stroke: #666; | |
stroke-width: 1.5px; | |
} | |
marker#licensing { | |
fill: green; | |
} | |
path.link.licensing { | |
stroke: green; | |
} | |
path.link.resolved { | |
stroke-dasharray: 0,2 1; | |
} | |
circle { | |
fill: #ccc; | |
stroke: #333; | |
stroke-width: 1.5px; | |
} | |
text { | |
font: 10px sans-serif; | |
pointer-events: none; | |
} | |
text.shadow { | |
stroke: #fff; | |
stroke-width: 3px; | |
stroke-opacity: .8; | |
} | |
body { | |
margin: 0; | |
} | |
#fullscreen { | |
position:absolute; | |
width:100%; | |
height:100%; | |
background:white; | |
opacity:0.3; | |
} | |
#sidepanel { | |
border:5px solid gray; | |
position:absolute; | |
top:80px; | |
right:10px; | |
padding:10px; | |
width:300px; | |
height:400px; | |
overflow:auto; | |
background:white; | |
display:none; | |
} | |
a { | |
color: #cf6557; | |
text-decoration:none; | |
} | |
.topic { | |
padding: 10px; | |
margin-bottom:10px; | |
background: gainsboro; | |
font-size: 10px; | |
cursor:pointer; | |
} | |
.fieldname { | |
font-family:Arial, Helvetica, sans-serif; | |
color: gray; | |
} | |
.connections { | |
font-size:42px; | |
color:#069; | |
} | |
.tweet { | |
font-size:21px; | |
font-family:Georgia, "Times New Roman", Times, serif; | |
margin-top:10px; | |
background:#EAEAEA; | |
padding:5px; | |
margin-bottom: 5px; | |
} | |
.time { | |
font-size:12px; | |
color:#F00; | |
} | |
.round { | |
-webkit-border-radius: 10px;-moz-border-radius: 10px;border-radius: 10px; | |
} | |
#popup { | |
display:none; | |
position:absolute; | |
z-index:9999; | |
opacity:0.9; | |
filter:alpha(opacity=90); | |
text-align:left; | |
max-width:300px; | |
max-height:300px; | |
overflow:auto; | |
} | |
.search { | |
width: 200px; | |
font-size:24px; | |
} | |
#search-big-display { | |
position:absolute; | |
left:10px; | |
bottom:10px; | |
color:white; | |
font-size:140px; | |
opacity:.1; | |
} | |
/* | |
#search-box { | |
margin:auto; | |
width:800px; | |
position:relative; | |
top:50px; | |
height:300px; | |
background:white; | |
z-index:10; | |
} | |
#search-inside { | |
padding:20px; | |
margin-bottom:10px; | |
background:gainsboro; | |
} | |
.search-box-title { | |
font-size:100px; | |
color: #444; | |
opacity: 0.5; | |
margin-left: 50px; | |
font-family: 'Fanwood Text', sans-serif; | |
top: 40px; | |
position: relative; | |
} | |
*/ | |
.search-box-title { | |
margin-left: 50px; | |
font-family: 'Fanwood Text', sans-serif; | |
top: 40px; | |
position: relative; | |
font-size: 70px; | |
color: #000; | |
opacity: 0.8; | |
margin-bottom: 20px; | |
font-family: Helvetica, Arial, sans-serif; | |
position: relative: | |
font-weight: bold; | |
marginleft: 20px; | |
} | |
#search-box { | |
margin:auto; | |
width:800px; | |
position:relative; | |
top:50px; | |
height:300px; | |
background:white; | |
z-index:10; | |
border: 3px solid #666; | |
} | |
#search-inside { | |
padding:20px; | |
margin-bottom:10px; | |
background:gainsboro; | |
margin-top: 40px; | |
font-family: Helvetica, Arial, sans-serif; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment