var statusWatcher = function(){
  var interval = 10*1000;//msec = 10sec
  var timeout = 60*60*1000;//msec = 1 hour
  var idgen = 0;
  var urls = [];
  var watch = false;
  var loadDate = null;
  var inst = {
    add:function(url,func){//return id
      var res = $.grep(urls,function(v){
          return v.url === url || (/^\/.+/.test(v.url) && (location.protocol+"//"+location.host + v.url) === url);
          //for IE:in ajax loaded html,a.href become full path including protocol
          //return v.url === url;
      });
      if(res && res.length>0){
        res[0].task.push({
          id: idgen,
          func: func
        });
      }else{
        urls.push({
          url: url,
          task: [{
                  id: idgen,
                  func: func
                }],
          sid: 0
        });
        inst.restart();
      }
      return idgen++;
    },
    remove:function(id){
      var res = $.grep(urls,function(v){
          return $.grep(v.task,function(w){
            return w.id === id;
          }).length > 0;
      });
      if(res && res.length>0){
        var j = -1;
        $.each(res[0].task,function(i,v){
            if(v.id === id){
              j = i;
              return false;
            }
        });
        if(j<0){
          return;
        }
        res[0].task.splice(j,1);
        if(res[0].task.length < 1){
          clearInterval(res[0].sid);
          var k = $.inArray(res[0],urls);
          urls.splice(k,1);
        }
      }
    },
    start:function(){
      loadDate = new Date();//update last page load time.
      $.each(urls,function(i,v){
          v.sid = setTimeout(function(){
            var callee = arguments.callee;
            if(new Date() - loadDate > timeout){
              inst.stop();
              return;
            }
            $.ajax({
              data: "json",
              dataType: "json",
              cache: true,
              url: v.url,
              success:function(data){
                if(data===null){
                  return;
                }
                $.each(v.task,function(j,w){
                  if(typeof(w.func) === "function"){
                    w.func(data);
                  };
                });
                return false;
              },
              complete: function(){
                v.sid = setTimeout(callee,interval);
              }
            });
          },interval);
      });
      watch = true;
    },
    stop:function(){
      if(watch){
        $.each(urls,function(i,v){
            clearTimeout(v.sid);
        });
        watch = false;
      }
    },
    restart:function(){
      inst.stop();
      inst.start();
    }
  };
  return inst;
}();

$(document).ready(function(){
    
    $('p#txt_point').each(function(){
        var url = $(this).find('a.hidden').attr("href");
        var that = this;
        var onStatusChange = function(toClass,removeClasses){
          var selected_tab = $("#ui-tab").tabs("option","selected");
          if($('p#txt_point').hasClass(toClass) === false) {
            $('p#txt_point').removeClass(removeClasses).addClass(toClass);
            if(selected_tab === 1){//update console
              $('#ui-tab').tabs('load',1);
            }else if(selected_tab === 4){//update customize
              $('#ui-tab').tabs('load',4); 
            }
            $('#reload-grouptree').click();
          }
        };
        if(url !== null){
          statusWatcher.add(url,function(data) {
                    switch(data.sidebar_status) {
                      case 'running':
                        onStatusChange('txt_running','txt_normal txt_stopped');
                        break;
                      case 'halted':
                        onStatusChange('txt_stopped','txt_running txt_normal');
                        break;
                      default:
                        onStatusChange('txt_normal','txt_stopped txt_running');
                    }
                    if(data.msg) {
                      var msgstatus = data.status + '<br />' + data.msg;
                      $('.get_status').html(msgstatus);
                    } else {
                      $('.get_status').html(data.status);
                    }
                });
        }
      });
});

