// remotamente basado en la demo nmdscript.js
// Usa thejit.org "InfoVis Toolkit"
var labelType, useGradients, nativeTextSupport, animate;
var uids = [];
var names = {};
$('div#friends').css('height', '770px');
$('div#friends').css('width', '735px'); //758 no va! 750 tampoco, 730 a veces
var FD = new $jit.ForceDirected({
injectInto: 'friends',
Node: {
'transform': false,
color: "#f00"
},
Edge: {
color: "#088",
lineWidth: 0.7
},
// Add node events
Events: {
enable: true,
type: 'Native',
//Change cursor style when hovering a node
onMouseEnter: function() {
FD.canvas.getElement().style.cursor = 'move';
},
onMouseLeave: function() {
FD.canvas.getElement().style.cursor = '';
},
//Update node positions when dragged
onDragMove: function(node, eventInfo, e) {
var pos = eventInfo.getPos();
node.pos.setc(pos.x, pos.y);
FD.plot();
},
//Implement the same handler for touchscreens
onTouchMove: function(node, eventInfo, e) {
$jit.util.event.stop(e); //stop default touchmove event
this.onDragMove(node, eventInfo, e);
}
},
Navigation: {
enable: true,
//Enable panning events only if we're dragging the empty
//canvas (and not a node).
panning: 'avoid nodes',
zooming: 100 //zoom speed. higher is more sensible
},
iterations:10,
levelDistance: 60,
onCreateLabel: function (domElement, node) {
domElement.innerHTML =
'
' + node.name + '
' +
'' + names[node.id] + '
' +
'
';
domElement.style.cursor = "pointer";
//domElement.onclick = function () {
// //graph.onClick(node.id, { hideLabels: false });
//};
},
onPlaceLabel: function (domElement, node) {
var width = domElement.offsetWidth;
var intX = parseInt(domElement.style.left);
intX -= width / 2;
domElement.style.left = intX + 'px';
}
});
function extracompute() {
FD.config.iterations=50;
FD.refresh();
if ($('input[name=sigue]').attr('checked')) {setTimeout( extracompute,0);} ;
};
// ver http://thejit.org/static/v20/Docs/files/Core/Core-js.html
//FD.compute(iterations) o no existe o no esta documentado,
//FD.computeIncremental({iter:50,
// property:'end',
// onStep: function(perc){
// //Log.write(perc + '% loaded...');
// FD.refresh();
// console.log(perc + '% loaded...');
// },
// onComplete: function() {
// FD.refresh(); //o FD.plot???
// }
// });
function haznada (pares, par) {
var nada=par
};
function init(eventid) {
uids = [];
names = {};
FD.graph.empty();
FD.canvas.clear();
var eventquery = FB.Data.query(
'select uid from event_member ' +
'where rsvp_status in ("attending","unsure")' + //, "unsure", "declined", "not_replied") ' +
'and eid = ' + eventid );
var userquery = FB.Data.query(
'select uid, name from user ' +
'where uid in ' +
' (select uid from {0})', eventquery);
//otra idea del original es dar tambien peso a los mensajes enviados
//entre los uid asistentes :'select ... from stream ' +
FB.Data.waitOn([eventquery, userquery],
function () {
$('#profiles').html(
_.reduce(eventquery.value,
function (memo, row) {
uids.push(row.uid);
return memo + //'' +
'' +
//'' +
''; //'
';
}, '')
);
names = _.reduce(userquery.value,
function (memo, row) {
memo[row.uid] = row.name;
return memo;
}, {});
alert('downloaded '+uids.length+' users'); //Object.keys(names).length
//Sospecha: el parse deja atascado el resto de las queries?
//FB.XFBML.parse(document.getElementById('container'));
//lanzamos las busquedas una por uid, para evitar limites de 500
//igual seria mejor una "uidstring" en grupos de 10.
var uidstring = uids.join(",");
var querywaits= FB.Array.map(uids, function(uid) {
//console.log(uid);
var friendquery = FB.Data.query(
'select uid1, uid2 from friend ' +
'where uid1 in ({1}) and uid2 in ({0})'
,uidstring, uid );
friendquery.wait( function (pares) {
if (pares.length==0) {
console.log ("una respuesta vacia");
} else {
console.log("procesando respuesta");
console.log(pares.length);
$('div#friends').queue( function(next) {
FB.Array.forEach(pares, function (par) {
console.log(par.uid1,par.uid2);
if (!FD.graph.hasNode(par.uid1)) {
FD.graph.addNode({id: par.uid1, name:""+par.uid1});
};
if (!FD.graph.hasNode(par.uid2)) {
FD.graph.addNode({id: par.uid2, name:""+par.uid2});
};
FD.graph.addAdjacence(FD.graph.getNode(par.uid1),
FD.graph.getNode(par.uid2),
null);
FD.root=par.uid1;
} );
console.log(pares);
console.log(FD);
//FD.compute();
FD.refresh();
console.log("llamando al next");
FB.XFBML.parse(document.getElementById('friends'))
setTimeout(next,0); //metemos todo en la cola de efectos
}); //.queue
}; //else
}); //wait
//devolvemos la busqueda por si acaso para no perder los punteros,
//en realidad deberia estar viva por ahi y luego limpiarse sola,
//asi que podriamos usar .forEach en vez de .map
//console.log(friendquery);
return friendquery;
});
}); //de waiton
}; //de init
function cargaevento(eventi) {
init(eventi);
};
$(function () {
// thejit stuff
var ua = navigator.userAgent,
iStuff = ua.match(/iPhone/i) || ua.match(/iPad/i),
typeOfCanvas = typeof HTMLCanvasElement,
nativeCanvasSupport = (typeOfCanvas == 'object' || typeOfCanvas == 'function'),
textSupport = nativeCanvasSupport
&& (typeof document.createElement('canvas').getContext('2d').fillText == 'function');
//I'm setting this based on the fact that ExCanvas provides text support for IE
//and that as of today iPhone/iPad current text support is lame
labelType = (!nativeCanvasSupport || (textSupport && !iStuff))? 'Native' : 'HTML';
nativeTextSupport = labelType == 'Native';
useGradients = nativeCanvasSupport;
animate = !(iStuff || !nativeCanvasSupport);
//final de thejit stuff
FB.init({
appId: '196714100359993',
status: true,
cookie: true,
xfbml: true
});
FB.Event.subscribe('auth.sessionChange', function (response) {
if (response.session) {
// init();
} else {
// The user has logged out, and the cookie has been cleared
}
});
FB.getLoginStatus(function(response) {
if (response.session) {
init();
} else {
// no user session available, someone you dont know
FB.login(function(response) {
if (response.session) {
// user successfully logged in
} else {
// user cancelled login
}
}, {perms:'user_events,friends_events'} );
}
});
});