// 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'} ); } }); });