function prepare (str, delim) {
         delim = delim == undefined ? ' ' : delim;
         var data = {}, symbols = str.split(delim);
         for (var i in symbols) {
                 data[symbols[i]] = symbols[i];
         }
         return data;
		}
		function updateNews(data)
		{
         // NOT IMPLEMENTED YET
         return false;
         var time = new Date(data.upd).toTimeString().substr(0, 8);

         $('#news').prepend(
                 '<div><small>' + time + '</small><b>' + data.id + '</b><br/>' + data.msg + '</div><br/>'
         );
         while ($('#news').find('DIV').size() > 50)
                 $('#news').find('DIV').last().remove();
		}
		function OnQuoteUpdate(obj)
		{
         if (fxpro_sym[obj.sym] == undefined)
                 return;

         var suffix = obj.type == 'mt4' ? '1_' : '_ecn1_';
         var pcn = Math.max(obj.bid.substr(obj.bid.indexOf('.')).length, obj.ask.substr(obj.ask.indexOf('.')).length) - 1;
         var cs = pcn % 2;
         var asup = obj.bid.substr(obj.bid.length - cs);
         var esup = obj.ask.substr(obj.ask.length - cs);
         var bid = obj.bid.substr(0, obj.bid.length - cs) + asup.sup();
         var ask = obj.ask.substr(0, obj.ask.length - cs) + esup.sup()
         var spread = Math.abs(obj.bid - obj.ask) * Math.pow(10, pcn - cs);
/*
         if (document.getElementById('bid' + suffix + obj.sym)) {
                         document.getElementById('bid' + suffix + obj.sym).innerHTML = bid;
         }
         if (document.getElementById('ask' + suffix + obj.sym)) {
                         document.getElementById('ask' + suffix + obj.sym).innerHTML = ask;
         }
         if (document.getElementById('spread' + suffix + obj.sym)) {document.getElementById('spread' + suffix + obj.sym).innerHTML = spread.toFixed(1);
         }
*/
         var color = obj.way == 'U' ? "#006600" : "#ED1C24";

         if (bid_element = document.getElementById('bid' + suffix + obj.sym)) {
                 bid_element.innerHTML = bid;
                 bid_element.style.color = color;
         }

         if (ask_element = document.getElementById('ask' + suffix + obj.sym)) {
                 ask_element.innerHTML = ask;
                 ask_element.style.color = color;
         }

         if (spread_element = document.getElementById('spread' + suffix + obj.sym)) {
                 spread_element.innerHTML = spread.toFixed(1);
         }
		}
		function PriceClient()
		{
         this.managers = {};
         this.stats = {};
         this.connected = false;
         this.socket = null;
         this.timeout = 0;
         this.delay = 1000;

         var self = this;

         // manager = {'name'=>type, 'callback': callback(data), 'args'=>...}
         // type: mt4, ecn, news
         this.addManager = function(manager) {
                 this.managers[manager.type] = manager;
                 if (this.connected)
                         this.send(manager);
         }

         this.init = function() {
                 if (this.socket != null)
                         this.socket.disconnect();
                 this.socket = io.connect('http://proxy.fxpro.com:8080');
                 this.socket.on('connect', function(data){
                         self.connected = true;
                         self.socket.emit('stats');
                         for (var manager in self.managers) {
                                 self.send(self.managers[manager]);
                                 self.socket.on(manager, function(data){
                                         self.handle(data)
                                 });
                         }
                 })
                 this.socket.on('stats', function(data){
                         self.stats = data;
                 });
                 this.socket.on('disconnect', function(){
                         self.connected = false;
                 });
         }

         this.send = function(manager) {
                 if (manager.args == undefined)
                         this.socket.emit(manager.type);
                 else
                         this.socket.emit(manager.type, manager.args);
         }
         this.handle = function(data) {
                 this.managers[data.type].callback(data);
         }
}

var fxpro_ps = null;
var fxpro_sym = 
prepare('EURUSD,EURGBP,USDJPY,GBPUSD,USDCHF,USDCAD,NZDUSD,AUDCAD,EURCAD,GBPJPY,EURJPY,EURCHF,EURAUD', ',');
window.onload = function(){

         fxpro_ps = new PriceClient();
         fxpro_ps.addManager({type: 'news', 'callback': updateNews});
         fxpro_ps.addManager({type: 'mt4', 'callback': OnQuoteUpdate, 'args': fxpro_sym});
         fxpro_ps.addManager({type: 'ecn', 'callback': OnQuoteUpdate, 'args': fxpro_sym});
         fxpro_ps.init();
};
