/* Adapted from here
    http://blog.pipes.yahoo.com/examples/example.01.html

 */

pipesrpc = {};
pipesrpc._timeoutlength = 30000;  /* 30 seconds by default */
pipesrpc._running = [];

pipesrpc._timeout = function(id,url) {
    var cbo = pipesrpc._running[id];
    pipesrpc._running[id]=null;
    if (!cbo.callbackErr) return;
    cbo.callbackErr("Timeout",-1,cbo.self);
}

pipesrpc._buildurl = function(pipeid,params) {
	var url = "http://pipes.yahoo.com/pipes/pipe.run?_id="+pipeid+"&_render=json";
	if (params) {
    	for (var key in params) {
            if (params[key]===null) continue;
    		url+="&"+encodeURIComponent(key)+"="+encodeURIComponent(params[key])
    	}
	}
    return url;
}

pipesrpc._callbackhandler = function(o) {
	var cbo = pipesrpc._running[callbackIndex];
    if (!cbo) return;
    pipesrpc._running[callbackIndex]=null;
   	window.clearTimeout(cbo.timeout);
   	if (!o || !o.count) {
   	    if (!cbo.callbackErr) return;
        cbo.callbackErr("Bad response",-2,cbo.self);
        return;
   	}
    if (!cbo.callbackOk) return;
    cbo.callbackOk(o,cbo.self);
}

pipesrpc._execute = function(url,callbackOk,callbackErr,timeoutlength) {
    if (!timeoutlength) timeoutlength = pipesrpc._timeoutlength;
    var id = pipesrpc._running.length;
  	url+="&_callback=pipesrpc._callbackhandler_"+id;
    var s=document.createElement("script");
    s.setAttribute("src",url);
    var fn = ""+pipesrpc._callbackhandler;
    fn = fn.replace(/callbackIndex/g,id);
    eval("pipesrpc._callbackhandler_"+id+"="+fn);
    pipesrpc._running.push({self:this,callbackOk:callbackOk,callbackErr:callbackErr,timeout:window.setTimeout(function() { pipesrpc._timeout(id,url); },timeoutlength)});    
    document.getElementsByTagName("head")[0].appendChild(s);
    return id;
}

/* use these three calls to run and cancel Pipes calls */
pipesrpc.cancelrequest = function(id) {
	var cbo = pipesrpc._running[i];
    window.clearTimeout(cbo.timeout);
    pipesrpc._running[i]=null;
}

pipesrpc.cancelallrequests = function() {
    for (var i=0; i<pipesrpc._running.length; i++) {
        pipesrpc._cancelrequest(i);
    }	
}

pipesrpc.run = function(pipeid,params,callbackOk,callbackErr,timeoutLength) {
    return pipesrpc._execute(pipesrpc._buildurl(pipeid,params),callbackOk,callbackErr,timeoutLength);
}