  function RPC(urlofscript,prepopulate){
    var url=urlofscript;
    var me=this;
    this.data=false;

    var pray=function(command,senddata,callback){
      var n;
      senddata=senddata || {};
      if(prepopulate){
	for(n in prepopulate){
           if(prepopulate.hasOwnProperty(n)){
	     senddata[n]=prepopulate[n];
	   }
	}
      }
      var todat=encodeURIComponent(JSON.stringify(senddata ||"",null," "));
      me.data={result:'pending'};
      $("#indicator").addClass("ired");
      con.writeln("Calling: "+command);
      waiter();
      $.ajax({url:url,
              async:true,
	      cache:false,
	      data:"command="+command+"&data="+todat,
	      dataType:'text',
	      type:'POST',
	      success:function(text){
		    endwait();
		    var plain=text;
		    var result='not-okay';
                    $("#indicator").removeClass("ired");
		  
		    me.data=JSON.parse(plain);
		    if(me.data && me.data.result){
                      result=me.data.result;
		    }
                    con.writeln("Receiving: "+command +" " +result);
		    if(callback){
		      callback(me.data);
		    }
		  }
          });
    }
    var method=function(command){
      return function (data,callback){
	pray(command,data,callback);
      }
    }

    //load functions
      $.ajax({url:url,
              async:false,
	      cache:false,
	      data:"",
	      dataType:'text',
	      type:'POST',
	      success:function(text){
		   var n;
		   var plain=text;
		   var data=JSON.parse(plain);

		    if(data.list){
		      for(n=0;n<data.list.length;n++){
			me[data.list[n]]=method(data.list[n]);
		      }
		    }
	      }
          });

     this.toString=function(){
       return JSON.stringify({ url:url,
       			       prepopulate:prepopulate,
			       data:this.data

       },null," ");
     }
  }
