RemoteAjax = {};

RemoteAjax.instances = {};
RemoteAjax.instancesIdx = 0;

RemoteAjax.getResponse = function(idx,data) {
  var params = RemoteAjax.instances[idx]; 
  delete(RemoteAjax.instances[idx]);
  if (params.instance!==undefined) {
    params.instance[params.success](data,params.extra);
  } else {
    params.success(data,params.extra);
  }
}

RemoteAjax.call = function(params) {
  var id = RemoteAjax.instancesIdx++;
  RemoteAjax.instances[id] = params;

  var st = '';
  for (var i in params.data) {
    if ((params.data[i]!==undefined)&&(params.data[i]!=null)) {
      if (st.length>0) st += '&'; else st += '?';
      
      st += encodeURIComponent(i)+'='+encodeURIComponent(RemoteAjax.hexEncoding(params.data[i]));
    }
  }
  if (st.length>0) st += '&'; else st += '?';
  st += 'staticfunction='+encodeURIComponent('RemoteAjax.getResponse');
  st += '&instanceidx='+id;
  var e = document.createElement("script");
  e.src = params.url+st;
  e.type = "text/javascript";  
  document.getElementsByTagName("head")[0].appendChild(e);
}

RemoteAjax.hexEncoding = function(st) {
  st = String(st);
  var mode = 0; //0 is 8-bit, 1 is 16-bit
  var res = '';
  var st2;
  for (var i=0; i < st.length; i++) {
    var c = st.charCodeAt(i);
    if (mode==0) {
      if (c>=256) {
        res += '-';
        mode = 1;
      }
    } else if (mode==1) {
      if (c<256) {
        res += '-';
        mode = 0;
      }
    }
    st2 = c.toString(16);
    while ((st2.length%2) !=0 ) st2 = '0'+st2;
    res += st2;
  }
  return res;
}

