function WebStream () {
	
	this.OrdersChannel="/worders";
	this.QuotesChannel="/wquotes";
	this.OrderResChannel="/worp";
	this.RiskChannel="/wrisk";
	this.user=null;
	this.password=null;
	this.realm=null;

	// Variables de estado de conexion.

	/**
	 * La hora del server del ultimo evento. Normalmente event.get("p_time").
	 */
	this.lastServerTime=null;

	/**
	 * La hora local del ultimo evento. Normalmente, new Date().getTime().
	 */
	this.lastTime=null;

	/**
	 * El maximo lag permitido entre eventos. Si el ultimo evento recibido fue hace mas de esta variable, se considera desconectado.
	 */
	this.lagTimeout=10000;

	/**
	 * La cantidad de reintentos de conexion en curso.
	 */
	this.connectionRetries=0;

	/**
	 * La cantidad maxima de intento de reconexion simples (forzar un refresh).
	 * Una vez alcanzados estos reintentos, se reconecta por completo.
	 */
	this.maxConnectionRetries=2;

	this.commCheck=null;

	this.subscriptions=new Array();

	this.markEvent=function(event) {
		this.lastTime=new Date().getTime();
		var aux = event.get("p_time");
		if (aux > this.lastServerTime) {
			this.lastServerTime=aux;
		}
	};
	this.getNode=function(lid) {
		return dojo.byId(lid);
	};
	this.login=function(user,pass,realm) {
		PL.login(user,pass,realm);
	};
	this.requestSubscriptions=function(acc) {
		this.debug("Solicitando subscripciones");
		if (acc) {
                        p_publish(this.OrdersChannel,iTags.TYPE,iTags.TYPE_REFRESHSUBS,iTags.ACCOUNT,acc);
                }else if(userManager.loggedin >0){
                        p_publish(this.OrdersChannel,iTags.TYPE,iTags.TYPE_REFRESHSUBS,iTags.ACCOUNT,userManager.user);
                }else{
                        p_publish(this.OrdersChannel,iTags.TYPE,iTags.TYPE_REFRESHSUBS);
                }

	};
	this.requestQuotes=function(pid) {
                        p_publish(this.OrdersChannel,iTags.TYPE,iTags.TYPE_REFRESHQUOTE);
	};
	this.subscribe=function(subject, force) {
		if(!force && this.checkSubscription(subject)) {
			this.debug("Ignorando subscripcion a " + subject);
			return;
		}
		PL.subscribe(subject);
	};
	this.checkSubscriptions=function(subject) {
		return false;
	};
	this.log=function(message,sender) {
		if (wsLogger) {
			if (!sender) {
				sender="WebStream";
			}
			wsLogger.log(message,sender);
		} else {
			alert(message);
		}
	}
	this.debug=function(message,sender) {
		if (wsLogger) {
			wsLogger.debug(message,sender);
		}
	}
	this.err=function(message,sender,sender) {
		if (wsLogger) {
			wsLogger.err(message);
		}
	}
	this.connect=function() {
		this.log("Conectando");
		p_join_listen();
		this.log("Conectado");
	}
	this._postConnect=function() {
		if (this.user && this.password) {
			this.login(this.user,this.password,this.realm);
		} else {
			// conexion anonima (al menos por ahora).
			this.requestSubscriptions();
		}
		if (this.commCheck) {
			clearInterval(this.commCheck);
		}
		this.commCheck=setInterval("checkConnection()",6000);
	};

}
var webStream = new WebStream();
/*
 * Funciones de pushlet 
 */
function onData(event) {
	//webStream.debug("onData " + event);
	webStream.markEvent(event);
	eventHandler.updateListeners(event);
}
function onAbort(event) {
	eventHandler.updateListeners(event);
}
function onLoginAck(event) {
	webStream.markEvent(event);
        webStream.debug("Login ack! event=" + event);
	webStream.requestSubscriptions();
	webStream.debug("Disparando refreshData");
	eventHandler.updateListeners(event);
	//refreshSubs();
}
function onEvent(event) {
	//webStream.debug("onEvent " + event);
	webStream.markEvent(event);
	eventHandler.updateListeners(event);
}
function onNack(event) {
	webStream.markEvent(event);
	eventHandler.updateListeners(event);
}
function onListenAck(event) {
	webStream.markEvent(event);
	webStream._postConnect();
}
function onSubscribeAck(event) {
	//webStream.debug("onSubscribeAck " + event);
	webStream.markEvent(event);
	eventHandler.updateListeners(event);
	
}
function onJoinAck(event) {
	webStream.log("joinAck");
	webStream.markEvent(event);
	eventHandler.updateListeners(event);
}
function addZero(vNumber){ 
    return ((vNumber < 10) ? "0" : "") + vNumber 
  } 

function formatDate(vDate, vFormat){ 
    var vDay                      = addZero(vDate.getDate()); 
    var vMonth            = addZero(vDate.getMonth()+1); 
    var vYearLong         = addZero(vDate.getFullYear()); 
    var vYearShort        = addZero(vDate.getFullYear().toString().substring(3,4)); 
    var vYear             = (vFormat.indexOf("yyyy")>-1?vYearLong:vYearShort) 
    var vHour             = addZero(vDate.getHours()); 
    var vMinute           = addZero(vDate.getMinutes()); 
    var vSecond           = addZero(vDate.getSeconds()); 
    var vDateString       = vFormat.replace(/dd/g, vDay).replace(/MM/g, vMonth).replace(/y{1,4}/g, vYear) 
    vDateString           = vDateString.replace(/hh/g, vHour).replace(/mm/g, vMinute).replace(/ss/g, vSecond) 
    return vDateString 
  } 

function checkConnection() {
	var now = new Date();
	var time = now.getTime();
	var lagTime = now - webStream.lastTime;
	webStream.debug("checkConnection: now=" + time + ", last=" + webStream.lastTime +", lagTime=" + lagTime);
	if (lagTime > webStream.lagTimeout) {
		if (webStream.connectionRetries < webStream.maxConnectionRetries) {
			try {
                               	webStream.connectionRetries++;
				webStream.debug("checkConnection: reintento " + webStream.connectionRetries);
				PL._doRequest("refresh","retry="+webStream.connectionRetries);
			} catch (err) {
				//alert("ERROR checkConnection: "+err);
			}
		} else {
			try {
				var event = new PushletEvent();
				event.put(iTags.TYPE, iTags.DISCONNECTED);
				eventHandler.updateListeners(event);
			} catch(err) {
				webStream.err("al enviar disconnected: " + err);
			}
			PL.leave();
			clearInterval(webStream.commCheck);
			//alert("Problemas en la conexion.\n Reconectando...");
			webStream.connect();
		}
	} else if (webStream.connectionRetries > 0) {
		webStream.debug("checkConnection: limpiando connectionRetries");
		webStream.connectionRetries=0;
	}
}

