/**
 * (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();
	// Forwardeo funciones de pushlet.
	this.subscribe=p_subscribe;
	this.listen=p_listen;
	this.publish=p_publish;

	this.isbroker=false;
	this.market=null;
	this.markets=new Array();
	this.accounts = new Array();
	this.debug=1;
	eventHandler.addListener(this);

	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 (account == this.markets[market]) {
				try {
					this.updatePosition(event);
					this.updateAccounts(event);
				   } catch(err) {
					this.log("error al actualizar una posicion: " + err);
				   }
			}else{
				this.log("Posicion ajena: Acc=" + account + " Pid=" + pid + "  (Mi Acc para el pid=" + acc + ")");
			}
		} else if (event.get(iTags.TYPE) == iTags.TYPE_SUBSCRIPTION) {
			this.log("Llego info de suscripcion! "  + event);
			//if (!this.loggedin) {
			//	this.log("No estoy logueado. Ignorando");
			//	return;
			//}
			try {

				for (var j in this.subscriptions){
        	                        var channel = this.subscriptions[j];
                		        var xx = channel.indexOf("/wrisk");
        	        	        if (xx >= 0){
	                                        this.log("p_unsubscribe("+j+") -> " + channel);
						this.subscriptions[j]='';
                                               	this.subscriptions.splice(j, 1);
		                               	p_unsubscribe(j);
	                               	}
                	        }
				this.updateSubscription(event);
				
			} 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!");
			//this.loggedin=0;
			top.location.reload();
		}
	};
	/*
	 * 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 acc=this.getAccount(market);
		if (acc == null) {
                        acc = new Account(market);
                        this.accounts[market] = acc;
                }	
		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);
                acc.account=event.get(iTags.ACCOUNT);
                this.log("account " + market + " fue actualizada");
	};

	this.getAccount=function(market){
		return this.accounts[market];
	};
	
	this.getAccountCash=function(market){
		return this.accounts[market].cash;
	};


	this.updatePosition=function(event) {
		var pid=event.get(iTags.PID);
		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){
			webStream.log("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);
			this.log("updateSubscription: " + pid + "," + mkt + "," + account);
			this.addSubscription(pid,mkt);
			try {
				
				this.markets[mkt]=account;
			} catch (err) {
				alert(err);
			}
			
		}
		if (this.loggedin) {
 			for (var j in this.markets){
				var acc=null;
				if (!this.isbroker) {
					acc=this.markets[j];
				}
				this.subscribeToRisk(j,acc);

				// TODO: Esto deberia estar en OrderManager y no aca!
				this.subscribeToOrder(j,acc);
			}
		}
	};

	this.subscribeMarket=function(mkt) {
		try {
			var risksub = "/wrisk/"+mkt;
			for (var j in this.subscriptions){
                	        var channel = this.subscriptions[j];
                        	if (channel == risksub) {
                                	this.log("subscribe existe: " + risksub);
                                	return;
				}
			}
			p_subscribe(risksub);
	                this.log("p_subscribe: " + risksub );
                } catch (err) {
                        this.log("ERROR: err");
                }
	};


	this.subscribeToRisk=function(mkt,account) {
		try {
			
		var risksub = null;
		if (account != null) {
			risksub = "/wrisk/"+mkt+"/"+account;
		} else if (this.isbroker) {
			risksub = "/wrisk/"+mkt;
		} else {
			return;
		}	
 		for (var j in this.subscriptions){
			var channel = this.subscriptions[j];
			if (channel == risksub) {
				this.log("subscribe existe: " + risksub);
				return;
			}
		}
		p_subscribe(risksub);
		this.log("p_subscribe: " + risksub );
		} catch (err) {
			alert(err);
		}

	};

	/**
	 * Subscribe al canal de respuestas de ordenes.
	 * @deprecated Esto deberia estar en OrderManager y no aca!
	 */
	this.subscribeToOrder=function(mkt,account) {
                try {
			var ordersub=null;
	                if (account != null) {
				ordersub = webStream.OrderResChannel +"/" + mkt + "/" + account;
			} else if (this.isbroker) {
				ordersub = webStream.OrderResChannel +"/" + mkt ;
			} else {
				this.log("ERROR: account es null");
                        	return;
			}
                	for (var j in this.subscriptions){
                        	var channel = this.subscriptions[j];
                        	if (channel == ordersub) {
                                	this.log("subscribe existe: " + ordersub);
                                	return;
                        	}
                	}
                	p_subscribe(ordersub);
                	this.log("p_subscribe: " + ordersub );
               	} catch (err) {
                       	this.log(err);
               	}

        };

	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.account="";
	this.enabled=0;
}
function Account(market){
	this.market=market;
	this.margin=0;
	this.pnl=0;
        this.cash=0;
        this.result=0;
        this.tpower=0;
        this.account=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.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);
	};
}
}

var userManager = new UserManager();

