var SimpleRadio = SimpleRadio || {

  __gateway: '/api/v0.1/',

  __argsToObj: function(args){
      var ret = {};
      /*
       * TODO(atm): This is fucking retarded. Murder Lucas for this. Also, fix
       * the thrift generator that makes this file to:
       * 1. Not put trailing commas in lists.
       * 2. Somehow pass the argument names to the __call function so that we
       * don't have to do any hacky garbage (see below) to figure them out.
       */
      jQuery.each(args.callee.toString().split(/\) ?\{/)[0].replace(/function ?\(/, '').split(','), function(i) {
          if(jQuery.trim(this)!='callback'){
              ret[jQuery.trim(this)] = encodeURIComponent(args[i]);
          }
      });
      return ret;
  },
  __call:function(service, method, args){
      var callback = (jQuery.isFunction(args[args.length-1])) ? args[args.length-1] : null;
      var url=SimpleRadio.__gateway+service+'/'+method+'.json?jsoncallback=?';

      var r = function(){
          jQuery.getJSON(
              url, 
              SimpleRadio.__argsToObj(args), 
              function(data){
                  if(jQuery.isFunction(callback)){
                      callback(data);
                  }
              }
          );
      };
      if(!jQuery){
          var s = document.createElement('<script />');
          s.src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js';
          s.type='text/javascript';
          s.onload=function(){
              jQuery.noConflict();
              r();
          };
          document.getElementsByTagName('head')[0].appendChild(s);
      }else{
          r();
      }
  },
  // Service: AuthService
  AuthService_login:function(username, password,callback){this.__call('AuthService', 'login', arguments);},
  AuthService_signup:function(email,callback){this.__call('AuthService', 'signup', arguments);},
  // Service: ImageService
  ImageService_get:function(id,callback){this.__call('ImageService', 'get', arguments);},
  ImageService_create:function(fingerprint, url,callback){this.__call('ImageService', 'create', arguments);},
  // Service: ProgramService
  ProgramService_create:function(fingerprint, station_id, name, description, air_date,callback){this.__call('ProgramService', 'create', arguments);},
  ProgramService_edit:function(fingerprint, program_id, station_id, name, description, air_date,callback){this.__call('ProgramService', 'edit', arguments);},
  ProgramService_addTrack:function(fingerprint, program_id, rs_id, position,callback){this.__call('ProgramService', 'addTrack', arguments);},
  ProgramService_moveTrack:function(fingerprint, program_id, position_1, position_2,callback){this.__call('ProgramService', 'moveTrack', arguments);},
  ProgramService_removeTrackPos:function(fingerprint, program_id, position,callback){this.__call('ProgramService', 'removeTrackPos', arguments);},
  ProgramService_removeTrackId:function(fingerprint, program_id, song_id,callback){this.__call('ProgramService', 'removeTrackId', arguments);},
  ProgramService_addImage:function(fingerprint, program_id, image_id,callback){this.__call('ProgramService', 'addImage', arguments);},
  ProgramService_removeImage:function(fingerprint, program_id, image_id,callback){this.__call('ProgramService', 'removeImage', arguments);},
  ProgramService_setPrimaryImage:function(fingerprint, program_id, image_id,callback){this.__call('ProgramService', 'setPrimaryImage', arguments);},
  ProgramService_get:function(id,callback){this.__call('ProgramService', 'get', arguments);},
  ProgramService_play:function(program_id,skip,callback){this.__call('ProgramService', 'play', arguments);},
  ProgramService_extend:function(program_id,callback){this.__call('ProgramService', 'extend', arguments);},
  ProgramService_save:function(program_id,callback){this.__call('ProgramService', 'save', arguments);},
  ProgramService_unsave:function(program_id,callback){this.__call('ProgramService', 'unsave', arguments);},
  ProgramService_voteUp:function(program_id,track_id,callback){this.__call('ProgramService', 'voteUp', arguments);},
  ProgramService_voteDown:function(program_id,track_id,callback){this.__call('ProgramService', 'voteDown', arguments);},
  // Service: TrackService
  TrackService_create:function(fingerprint, title, album, artist, info_url, url,callback){this.__call('TrackService', 'create', arguments);},
  TrackService_edit:function(fingerprint, id, title, album, artist, info_url, url,callback){this.__call('TrackService', 'edit', arguments);},
  TrackService_get:function(id,callback){this.__call('TrackService', 'get', arguments);},
  TrackService_multiGet:function(ids,callback){this.__call('TrackService', 'multiGet', arguments);},
  TrackService_autocompleteSong:function(query,callback){this.__call('TrackService', 'autocompleteSong', arguments);}
};

