//this script do nothing but contain some useful functions and constants

var SIGN_PRETRADING        = 0x01;     // признак того что инструмент торгуется в дополнительных сессиях
var SIGN_MARGINAL          = 0x02;     // признак для маржируемых опционов
var SIGN_SPOT              = 0x04;     // признак спот инструмента
var SIGN_SPOT_MAIN         = 0x08;     // признак главного спот инструмента
var SIGN_ANONIMOUS         = 0x10;     // признак анонимной торговли по инструменту
var SIGN_NEGOTIATED        = 0x20;     // признак адресной торговли по инструменту
var SIGN_DAYTRADING        = 0x40;     // признак того что инструмент торгуется в основную сессию
var SIGN_SPOT_DELIVER      = 0x80;     // признак того что это спот инструмент выходящий на поставку
var SIGN_MULTILEG          = 0x100;    // признак инструмента-связки
var SIGN_MULTILEG_MAIN     = 0x200;    // признак главного инструмента-связки
var SIGN_MONEY             = 0x800;    // признак инструмента Money
var SIGN_RATE_OR_SWAP      = 0x1000;   // признак 1 - Котировать в ставке,	0 - Котировать в своп-цене
var SIGN_IS_PERCENT        = 0x2000;   // признак того что инструмент торгуется в процентах
var SIGN_CALENDAR_SPREAD   = 0x10000;  // признак календарного спреда
var SIGN_RISK_TRANSFER     = 0x20000;  // признак инструмента переноса риска
var SIGN_COLLATERAL        = 0x40000;  // признак коллатерального фьючерса

var ORDER_STATUS_LIMIT_ORDER           = 0x01;                //Котировочная
var ORDER_STATUS_COUNTER_ORDER         = 0x02;                //Встречная
var ORDER_STATUS_NEGOTIATED_ORDER      = 0x04;                //Внесистемная
var ORDER_STATUS_DONT_CHECK_OPT_LIMITS = 0x200;               //Не проверялись лимиты премий по опционам
var ORDER_STATUS_TRANSACTION_END       = 0x1000;              //Запись является последней в транзакции
var ORDER_STATUS_REPO_WITH_CC          = 0x2000;              //Заявка Репо с КЦ
var ORDER_STATUS_REPO                  = 0x20000;             //Заявка Репо
var ORDER_STATUS_PSEUDO_REPO           = 0x40000;             //Обычная заявка по связке
var ORDER_STATUS_FILL_OR_KILL          = 0x80000;             //Заявка Fill-or-kill
var ORDER_STATUS_MOVED_ORDER           = 0x100000;            //Запись является результатом операции перемещения заявки
var ORDER_STATUS_DELETED_ORDER         = 0x200000;            //Запись является результатом операции удаления заявки
var ORDER_STATUS_MASS_DELETED          = 0x400000;            //Запись является результатом группового удаления
var ORDER_STATUS_CROSS_DEAL            = 0x20000000;          //Признак удаления остатка заявки по причине кросс-сделки

var ORDER_STATUS_DELETED_BY_COD        = 0x100000000;         //Признак удаления заявки сервисом Cancel On Disconnect

var ORDER_STATUS_NCC_REQUEST           = 0x4000000000;        //Запрос НКЦ
var ORDER_STATUS_AUTO_CONFIRM          = 0x4000000000000;

var ORDER_STATUS_IQS                   = 0x800000000;	    // Проставляется в заявках выставленных из IQS системы
var ORDER_STATUS_RFS                   = 0x400000000000;	// Проставляется в заявках выставленных из RFS системы
var ORDER_STATUS_ICEBERG               = 0x800000000000;    // Проставляется в iceberg заявках

var DEAL_STATUS_LIMIT_ORDER            = 0x01;            //Сделка была образована котировочной заявкой
var DEAL_STATUS_COUNTER_ORDER          = 0x02;            //Сделка была образована встречной заявкой
var DEAL_STATUS_NONSYSTEM              = 0x04;            //Внесистемная
var DEAL_STATUS_DONT_CHECK_LIMITS      = 0x10;            //Не проверялись лимиты клиента при постановке заявки
var DEAL_STATUS_EXERCISE               = 0x20;            //Сделка является сделкой исполнения
var DEAL_STATUS_EXPIRATION             = 0x80;            //Признак истечения времени действия инструмента
var DEAL_STATUS_CC_REPO                = 0x2000;          //Cделка клирингового Репо
var DEAL_STATUS_REPO_PART              = 0x4000;          //0 - техническая сделка первой части 1 - техническая сделка второй части
var DEAL_STATUS_POSITION_TRANSFER      = 0x10000;         //Сделка по переносу позиции
var DEAL_STATUS_REPO                   = 0x20000;         //Cделка Репо
var DEAL_STATUS_PSEUDO_REPO            = 0x40000;         //Сделка Псевдо-Репо
var DEAL_STATUS_DISAPPEARANCE  	       = 0x800000;        //Сделка истечения инструмента (не путать с исполнением)
var DEAL_STATUS_STD_SETTLEMENT         = 0x1000000;       //Сделка поставки через RTS Standard
var DEAL_STATUS_OTC                    = 0x2000000;       //Сделка сформированная вне торгов
var DEAL_STATUS_NEGOTIATED             = 0x4000000;       //Адресная сделка
var DEAL_STATUS_MULTILEG               = 0x8000000;       //Сделка по связке
var DEAL_STATUS_NON_DELIVERY           = 0x10000000;      //Сделка при непоставке
var DEAL_STATUS_SETTLEMENT             = 0x40000000;      //Сделка исполнения фьючерса или инструмента RTS Standard (кроме исполнения фьючерса через RTS Standard)
var DEAL_STATUS_NCC_REQUEST            = 0x4000000000;    //Сделка образована Запросом НКЦ

var DEAL_STATUS_IQS                    = 0x800000000;	    // Проставляется в заявках выставленных из IQS системы
var DEAL_STATUS_RFS                    = 0x400000000000;    // Проставляется в заявках выставленных из RFS системы
var DEAL_STATUS_ICEBERG                = 0x800000000000;    // Проставляется в iceberg сделках
var DEAL_STATUS_AUTO_CONFIRM           = 0x4000000000000;   // Признак автоматического подтверждения котировки (RFS)

var connectionOpenTimeout = 5000;
var listenerOpenTimeout   = 5000;
var publisherOpenTimeout  = 5000;

function openConnection(initString)
{
    var conn = cgate.conn_open(initString);

    //wait for connection status update
    if (!cgate.wait_for_conn_opened(conn, connectionOpenTimeout)) 
    {
        throw new Error('Failed to open the connection');
    }
    return conn;
}

function openListener(conn, initString, mode)
{
    var lsn = cgate.lsn_open(conn, initString, mode);
    if (0 == lsn)
    {
        throw new Error('Failed to create listener ' + initString);
    }
    else if (!cgate.is_lsn_snapshot_done(lsn) && !cgate.wait_for_lsn_opened(lsn, listenerOpenTimeout))
    {
        throw new Error('Failed to open listener ' + initString);
    }
    return lsn;
}

function openPublisher(conn, initString)
{
    var pub = cgate.pub_open(conn, initString)
    if (0 == pub)
    {
        throw new Error('Failed to create publisher ' + initString);
    }
    else if (!cgate.wait_for_pub_active(pub, publisherOpenTimeout))
    {
        throw new Error('Failed to open publisher ' + initString);
    }
    return pub;
}

function currentTime()
{
    var currentdate = new Date(); 
    var datetime = '' + currentdate.getFullYear() + '.' 
                 + ((currentdate.getMonth() < 9) ? '0' : '') + (currentdate.getMonth()+1) + '.' 
                 + ((currentdate.getDate() < 10) ? '0' : '') + currentdate.getDate() 
                 + ' '  
                 + ((currentdate.getHours() < 10) ? '0' : '') + currentdate.getHours() + ':' 
                 + ((currentdate.getMinutes() < 10) ? '0' : '') + currentdate.getMinutes() + ':' 
                 + ((currentdate.getSeconds() < 10) ? '0' : '') + currentdate.getSeconds() + '.' 
                 + ((currentdate.getMilliseconds() < 10) ? '0' : '') + ((currentdate.getMilliseconds() < 100) ? '0' : '') + currentdate.getMilliseconds();
    return datetime;
}