Wiking.PositionUpdater = new function()
{
  var run = 0;
  var session = 0;
  var xhr;
  /*
   * funkcja uruchamiająca
   */
  this.start=function()
  {
      if (run==1){
         this.stop();
         session++;
      }
      run = 1;
      start_request(session);
  }
  /*
   * funkcja zatrzymująca
   */
  this.stop=function()
  {
      run = 0;
      try
      {// bo może nie zadziałać na IE6
          xhr.transport.abort();
      }
      catch(e){}
  }
  /*
   * inicjalizujący request live'a
   */
  var start_request = function(sid)
  {
      Wiking.Event.trigger({e:'GetPositionsRequest'});
      xhr = new Ajax.Request('thingy/getpositions?a=1',{
        method:'GET',
        onSuccess:start_success.bindAsEventListener(this,sid),
        onFailure:failure.bindAsEventListener(this,sid)
      }); //TODO failure
  };
  var start_success = function(e,session)
  {
      success(e,session);
      Wiking.Event.trigger({'e':'GotPositions'});
  };
  /*
   * request do servera live'a
   */
  var request=function(sid)
  {
      if (session!=sid){
          return
      }
      xhr = new Ajax.Request('thingy/live?a=1',{
        method:'GET',
        onSuccess:success.bindAsEventListener(this,sid),
        onFailure:failure.bindAsEventListener(this,sid)
      });
  }
  /*
   * prywatna metoda obsługująca przychodzące dane
   */
  var success = function(transport,session)
  {
       if (!run) return;
       
       var json = transport.responseJSON;
       if (json=="UNAUTHORIZED")
       {
           Wiking.Event.trigger({e:'UNAUTHORIZED'});
           return;
       }    
       var obj = Wiking.getObjects();
       var arr;
       for (var i=0, l=obj.length;i<l;i++)
       {
           if (arr = json[obj[i].getImei()]) // celowo pojedyńcze '='
           {
               obj[i].update(arr[0],arr[1],arr[2],arr[3]); // json looks like: [{lng:x,lat:x,v:x,date:x}] // TODO move * n /or/ redesign move 
           }
       }
       Wiking.Event.trigger({'e':'newpos'});
       request.defer(session); // IE ma stack overflow bez defera
  }
  /*
   * funkcja odpowiadająca za działania w przypadku niepowodzenia requesta
   */
  var failure=function(resp,session)
  {
      if (!run) return;
      //TODO: może byśmy coś zrobili jakieś info że jest problem?
      request(session);// TODO , defer?
  }
  this.toString = function()
  {
      return "PositionUpdater";
  }
}

