/**
 * (c) 2005 Primary Brokers S.A. - http://www.primary.com.ar/
 */
function UserManager (){
	this.user="";
	/**
	 * La clave, actualmente es el ID de sesion de PHP
	 */
	this.pass="";
	this.name="UserManager";
	this.loggedin=0;
	this.positions = new Array();
	this.subscriptions= new Array();
	this.rsubscriptions= new Array();
	// Forwardeo funciones de pushlet.
	this.subscribe=p_subscribe;
	this.listen=p_listen;
	this.publish=p_publish;

	// Ticket #107 (BORRAR)
	//this.margin=0;
	//this.cash=0;
	//this.result=0;
	//this.pnl=0;
	//this.tpower=0;
	//this.account="";

	this.isbroker=false;
	this.brokerID=null;
	this._accounts = new Array();
	this._markets = new Array();
	this._activeAccounts = new Array();
	this.debug=1;
	eventHandler.addListener(this);

	this.getAccount=function(id) {
		return this._accounts[id];
	};

	this.addAccount=function(account) {
		this._accounts[account.id]=account;
	};

	/**
	 * Obtiene una copia del vector de cuentas.
	 */
	this.getAccounts=function() {
		var ret = [];
		for (i in this._accounts) {
			ret.push(this._accounts[i]);
		}
		return ret;
	};
	this.listAccounts=function() {
		var ret = [];
		for (i in this._accounts) {
			ret.push(this._accounts[i].account);
		}
		return ret;
	};

	this.addActiveAccount=function(account,market,broker) {
		var tag=""+account + market + broker;
		this._activeAccounts[tag]=[account,market,broker];
	};

	this.listActiveAccounts=function() {
		var ret = [];
		for (i in this._activeAccounts) {
			ret.push(this._activeAccounts[i]);
		}
		return ret;
	};
		


	this.login=function(user,pass) {
		this.pass=pass;
		this.user=user;
		this.log("login " + user + ":" + pass);
		p_login(user,pass);
	};

	this.logout=function() {
		try {
			p_leave();
			this.loggedin=0;
		} catch(err) {
			this.log("ERROR: logout: " + err);
		}
		//location.reload();
	};

	this.onData=function(event) {
		if (event.get('p_event') == iTags.TYPE_LOGIN_ACK) {
			this.user=event.get('p_user');
			this.loggedin=1;
			this.log("Logged IN! user=" + this.user);
		} else if (event.get(iTags.TYPE) == iTags.TYPE_POSITION) {
			this.log("Llego Posicion: " + event );
			var account = event.get(iTags.ACCOUNT);
			var market = event.get(iTags.MARKET);
			var pid = event.get(iTags.PID);
			if (!this._markets[market]) {
				this.log("seteando la cuenta de " + market + " a " + account);
				this._markets[market]=account;
			}
			if (this._accounts[account] != null) {
				try {
					this.updatePosition(event);
					this.updateAccounts(event);
				   } catch(err) {
					this.log("error al actualizar una posicion: " + err);
				   }
			}else{
				this.log("Posicion ajena: Acc=" + account );
			}
		} else if (event.get(iTags.TYPE) == iTags.TYPE_SUBSCRIPTION) {
			this.log("Llego info de suscripcion! "  + event);
			try {

				for (var j in subscriptions){
        	                        var channel = subscriptions[j];
                		        var xx = channel.indexOf("/wrisk");
        	        	        if (xx >= 0){
	                                        this.log("p_unsubscribe("+j+") -> " + channel);
						subscriptions[j]='';
                                               	subscriptions.splice(j, 1);
		                               	p_unsubscribe(j);
	                               	}
                	        }
				this.updateSubscription(event);
				p_publish(OrdersChannel,iTags.TYPE,iTags.TYPE_RISK_ACCOUNTREFRESH);
			} catch(err) {
				this.log("error al recibir una subscripcion: " + err);
			}

     			//if (this.isbroker && this.markets[0] !=null) {
                                //this.log("ISBROKER!  market=" + this.market);
                                //p_subscribe("/wrisk/"+this.market);
				//p_subscribe(OrderResChannel+"/"+this.market);
				//refreshOperation(j,null);		
                        //}
		} else if (event.get(iTags.TYPE) == iTags.TYPE_YOU_ARE_DEAD) {
			this.log("I Am Dead: Reload!");
			top.location.assign(top.location.href);
		}
	};
	/*
	 * Deberia ser despreciada segun el ticket #107
	 * @deprecated
	 */
	this.getTotalResult=function() {
		return this.cash + this.pnl + this.result;
	};

	this.updateAccounts=function(event){
		var market=event.get(iTags.MARKET);
		var currency= event.get(iTags.CURRENCY);
               	var account=event.get(iTags.ACCOUNT);
		var acc=this.getAccount(account);
               	var accname=event.get(iTags.ACCOUNT_NAME);
		var broker= event.get(iTags.BROKER);
		if (acc == null) {
			this.log("Cuenta inexistente! " + account);
			return;
                }	
		acc.accname = accname;
		acc.broker = broker;
		acc.currency = currency;
		acc.margin= event.get(iTags.TOTAL_OPEN_MARGIN);
                acc.pnl=event.get(iTags.TOTAL_PNL);
                acc.cash=event.get(iTags.CASH);
                acc.result=Math.round(event.get(iTags.RESULT)*100)/100;
                acc.tpower=event.get(iTags.TRADING_POWER);
                this.log("account " + account + " fue actualizada");
	};

	this.getAccountCash=function(account){
		return this.getAccount(account).cash;
	};


	this.updatePosition=function(event) {
		var pid=event.get(iTags.PID);
		if (pid == null) {
			this.log("updatePosition: no hay PID");
			return;
		}
			
		var pos=this.getPosition(pid);
		if (pos == null) {
			pos = new Position(pid);
			this.positions[pid] = pos;
		}
		pos.size=event.get(iTags.POSITION);
		pos.price=event.get(iTags.PPP);
		pos.result=Math.round(event.get(iTags.PNL)*100)/100;
		pos.margin=event.get(iTags.OPEN_MARGIN);
		this.log("posicion de " + pid + " actualizada");
	};
		
	this.listPositions=function(){
                var ret = new Array();
                for (i in this.positions) {
                        ret.push(""+i);
                }
                return ret;
        };

        this.getPosition=function(pid) {
                return this.positions[pid];
        };

	this.getPositionPrice=function(pid) {
		return getPosition(pid).price;
	};
	this.getPositionSize=function(pid) {
		return getPosition(pid).size;
	};

	this.getPositionResult=function(pid) {
		return getPosition(pid).result;
	};
		
	this.getPositionMargin=function(pid) {
		return getPosition(pid).margin;
	};
	this.log=function(msg) {
		if (this.debug==1){
			pstatus("UserManager: " + msg);
		}
	};
function Position(pid) {
	this.price=0;
	this.pid=pid;
	this.size=0;
	this.result=0;
	this.margin=0;
}

	//function writeData(data,lid) {
	//	var layer = getRawObject(lid);
	//	if (layer) {
	//		layerWrite(layer,data);
	//	}
	//}

	this.updateSubscription=function(event) {
		this.subscriptions=new Array();
		var count = event.get(iTags.COUNT);
		this.log("updateSubscription: count="+count);
		this._markets=new Array();
		for (var i=0;i<count;i++) {
			var pid=event.get(iTags.SUBSCRIPTION + i + iTags.PID);
			var mkt=event.get(iTags.SUBSCRIPTION + i + iTags.MARKET);
			var account=event.get(iTags.SUBSCRIPTION + i + iTags.ACCOUNT);
			var broker=event.get(iTags.SUBSCRIPTION + i + iTags.BROKER);
			var currency=event.get(iTags.SUBSCRIPTION + i + iTags.CURRENCY);
			this.log("updateSubscription: " + pid + "," + mkt + "," + account);
			this.addSubscription(pid,mkt);
			try {
				if (!this._accounts[account]) {
					var a = new Account(account);
					a.currency=currency;
					a.broker=broker;
					this._accounts[account]=a;
					this.log("agregando account " + a);
				}
				var tag=""+account+mkt+broker;
				if (!this._activeAccounts[tag]) {
					this._activeAccounts[tag]=[account,mkt,broker];
					this.log("agregando tag " + tag);
				}
				this._markets[mkt]=account;
			} catch (err) {
				alert(err);
			}
			
		}
	
		if (this.isbroker) {
			this.log("llamando a subscribeBroker");
			this.subscribeBroker();
			this.log("fin de llamada a subscribeBroker");
			for (i in this._markets) {
				
			}
		} else if (this.loggedin) {
			this.log("llamando a subscribeRisk");
			this.subscribeRisk();
			this.log("fin de llamada a subscribeRisk");
		}
	};

	this.subscribeBroker=function(mkt) {
		try {
			var risksub = "/wrisk/"+this.brokerID;
			p_subscribe(risksub);
	                this.log("subscribeBroker: p_subscribe: " + risksub );
                } catch (err) {
                        this.log("ERROR: err");
                }
	};


	this.subscribeRisk=function() {
		try {
		for (i in this._activeAccounts) {
			var x = this._activeAccounts[i];
			var subject="/wrisk/"+x[2]+"/"+x[0];
	                this.log("p_subscribe: " + subject );
			p_subscribe(subject);
		}
		} catch (e) {
			this.log("ERROR: subscribeRisk: " + e );
		}
	};

	this.isSubscripted=function(pid) {
		if (this.subscriptions[pid] != null) {
	//	if (this.subscriptions.indexOf(pid) >=0) {
				return true;
		}
		return false;
	};
			
	this.addSubscription=function(pid,market) {
		this.subscriptions[pid]=market;
		this.log("addSubscription: [" + this.subscriptions.length+"] " + pid + "," + market);
	};

	this.listSubscriptions=function(){
                var ret = new Array();
                for (i in this.subscriptions) {
                        ret.push(""+i);
                }
                return ret;
        };

        this.getSubscription=function(pid) {
                return this.subscriptions[pid];
        };
}
function Subscription(pid) {
	this.pid=pid;
	this.market="";
	this.broker="";
	this.account="";
	this.enabled=0;
}
function Account(id){
        this.account=id;
        this.accname="";
	this.market="";
	this.broker="";
	this.currency="";
	this.margin=0;
	this.pnl=0;
        this.cash=0;
        this.result=0;
        this.tpower=0;
	/**
	 * Actualiza los valores desde un evento de posicion.
	 * @param event un POSITION_EVENT.
	 */
	this.update=function(event) {
		var market = event.get(iTags.MARKET);
		if (this.market != market) {
			return;
		}
		var account = event.get(iTags.ACCOUNT);
		if (this.account != account) {
			return;
		}
		this.market=market;
		this.account=account;
        	this.accname=event.get(iTags.ACCOUNT_NAME);
        	this.currency=event.get(iTags.CURRENCY);
        	this.broker=event.get(iTags.BROKER);
        	this.margin=event.get(iTags.TOTAL_OPEN_MARGIN);
        	this.pnl=event.get(iTags.TOTAL_PNL);
        	this.cash=event.get(iTags.CASH);
        	this.result=event.get(iTags.RESULT);
        	this.tpower=event.get(iTags.TRADING_POWER);
		userManager.log("updated " + this);
	};
	this.toString=function() {
		return "Account: ["+this.account+","+this.accname+","+this.broker+","+this.currency+","+this.market+"]";
	};
}



