
    function BxSpy()
    {
        // contain page's URL for queries;
        this.sPageReceiver           = '',
        this.updateTimeNotifyHandler = '',
        this.sEventsContainer        = '',
        this.sPageMode               = '',

        this.iUpdateTime  = 0,
        this.iLastEventId = 0;
        this.iEventsCount = 0;
        this.iPerPage     = 0;

        this.iSlideDown   = 0;
        this.iSlideUp     = 0;

        this.PageUpdate = function()
        {
            var _sRandom = Math.random();
            var self = this; 

            // check for updates;
            $.get(this.sPageReceiver + 'check_updates/' + this.sPageMode + '/' + this.iLastEventId + '&_r=' + _sRandom, 
                function(sData)
                {
                    var oResponse = eval("(" + sData + ")");
                    var $oWrapper = $('#' + self.sEventsContainer);

                    self.iLastEventId = oResponse.last_event_id;

                    // draw new events;
                    var iEventsCount = oResponse.events.length;
                    if(iEventsCount) {
                        // remove empty block if have some events;
                        $oWrapper.find('.MsgBox').remove();

                        for( var i = 0; i < iEventsCount; i++ )
                        {
                            if(typeof oResponse.events[i].event != 'undefined') {
                                // add new event;
                                $oWrapper.prepend(oResponse.events[i].event);
                                self.iEventsCount++;

                                //set effect;
                                $oWrapper.find('div.spy_events_wrapper:first').slideDown(self.iSlideDown);
                                   
                                // remove the latest event;
                                if(self.iEventsCount > self.iPerPage) {
                                    $oWrapper.find('div.spy_events_wrapper:not(:animated):last').slideUp(self.iSlideUp, function()
                                    {
                                        $(this).remove()
                                        self.iEventsCount--;
                                    });
                                }
                            }
                        }
                    }

                    // check updates ;
                    self.updateTimeNotifyHandler = setTimeout(function(){
                        self.PageUpdate();
                    },self.iUpdateTime);
                }
            );
        }
    }