socket.io disconnect and browser closing

I am using socket.io on my rails app to server user online/offline on the database,I am using Redis for storing data and 0 fore offline and 1 for online status on my app.js file

var app = require('express')()
, redis = require('redis')
, client = redis.createClient()
, server = require('http').createServer(app)
, io = require('socket.io').listen(server);

server.listen(80);

io.sockets.on('connection', function (socket) {
console.log("client connected")


socket.on('join',function(userid){
socket.set('userid',userid);

var utm ="user:"+userid+":online_status";
client.set(utm,1);

});
socket.on('disconnect',function(userid){
socket.get('userid',function(err,userid){
var utm ="user:"+userid+":online_status";
client.set(utm,0);
});
});
});

and on my application.html layout I am including already socket.io.js on my application.js file and its working well



    var socket = io.connect('http://localhost:80');

     socket.on('connect',function(data){
      var userID = current_user.id;
      socket.emit('join',userID);

     });

every thing is working fine except when user open two windows on the same time ,if he close one window disconnect event triggered and his status become offline,,how can I make the disconnect event only working when user close all windows not only one?

Instead of a binary to store the state, perhaps use a connection counter. Increment on connect and decrement on disconnect. When it's 0, the user has closed all windows.

You might also consider an expiration on these counters, in case the user disappears in a way that prevents the disconnect event from firing (e.g. browser crash, network disconnect, etc).

This code is approximate, but try it:

socket.on('join',function(userid){
    socket.set('userid',userid);
    var utm ="user:"+userid+":online_status";
    client.incr(utm);
});

socket.on('disconnect',function(userid){
  socket.get('userid',function(err,userid){
    var utm ="user:"+userid+":online_status";
    client.decr(utm);
  });
});