
    /** 
     * Class constructor
     * 
     * @param oParams object
     */
    function eSASeOnlineMembers(oParams)
	{ 
        this.bErrorInitialization = false;

        //-- init private vars --//

        //Count of max visible members
        oParams.max_count_members
            ? this._iMaxCountMembers = parseInt(oParams.max_count_members)
            : this.bErrorInitialization = true;

        //Recived count of members
        oParams.count_members 
            ? this._iCountMembers = parseInt(oParams.count_members)
            : this.bErrorInitialization = true;

        //AJAX page reciver
        oParams.page_receiver 
            ? this._sPageReceiver = oParams.page_receiver
            : this.bErrorInitialization = true;   

        //Refresh script time    
        oParams.refresh_time 
            ? this._iRefreshTime = parseInt(oParams.refresh_time)
            : this.bErrorInitialization = true;

        //Page mode
        oParams.page_mode 
            ? this._sPageMode = oParams.page_mode
            : this.bErrorInitialization = true;   

        //Members list
        this._sMembersList =  oParams.members_list 
            ? oParams.members_list
            : '';  

        //Members area
        oParams.members_area 
            ? this._sMembersArea = oParams.members_area
            : this.bErrorInitialization = true;  

        //Options area
        oParams.options_area 
            ? this._sOptionsArea = oParams.options_area
            : this.bErrorInitialization = true;  

        //Cookie name
        oParams.cookie_name 
            ? this._sCookieName = oParams.cookie_name
            : this.bErrorInitialization = true;  

        //Check menu enabled
        this._iMenuEnabled = oParams.menu_enabled 
            ? parseInt(oParams.menu_enabled)
            : 1;  

        //Enable menu cookie name
        oParams.menu_enabled_cookie_name 
            ? this._sEnabledMenuCookieName = oParams.menu_enabled_cookie_name
            : this.bErrorInitialization = true;  

        oParams.toggle_active_img 
            ? this._sToggleActiveSrc = oParams.toggle_active_img
            : this.bErrorInitialization = true; 

        oParams.toggle_not_active_img 
            ? this._sToggleNotActiveSrc = oParams.toggle_not_active_img
            : this.bErrorInitialization = true;

        //Toggle  area
        oParams.toggle_area 
            ? this._sToggleArea = oParams.toggle_area
            : this.bErrorInitialization = true;  
        //--

        //check error initialization
        if(this.bErrorInitialization) {
            alert('Error initialization of online member menu');
            return;
        }

        this._oMembersArea = $(this._sMembersArea);
        this._oOptionsArea = $(this._sOptionsArea);
        this._oToggleArea = $(this._sToggleArea);

        this._sActiveButtonClass = 'active';
        this._RefreshTimeHandler = '';
        this._iAnimationSpeed = 1500;
        this._sAjaxDescriptior = '';
        this._iExpireCookieDays = 360;
        var _self = this;

        //start checking again
        this._RefreshTimeHandler = setTimeout(function(){
            _self._checkMembers();
        }, this._iRefreshTime);
	}

    //-- PUBLIC METHODS --//

    /**
     * Show or hide menu
     *
     * @return void
     */
    eSASeOnlineMembers.prototype.toggleMenu = function()
    {
        var $oWrapper = $(this._sMembersArea).parent();
        var self = this;

        if( $oWrapper.is(':visible') ) {
            self._oToggleArea.attr('src', self._sToggleNotActiveSrc);
            $oWrapper.slideUp(this._iAnimationSpeed, function(){
                self._stopUpdates();
                self._iMenuEnabled = 0;
                self._oOptionsArea.css( { 'visibility': 'hidden' } );

                //set cookie
                $.cookie(self._sEnabledMenuCookieName, self._iMenuEnabled, {expires: self._iExpireCookieDays,  path: '/'});
            });
        }
        else {
            self._oToggleArea.attr('src', self._sToggleActiveSrc);
            $oWrapper.slideDown(this._iAnimationSpeed, function(){
               self._iMenuEnabled = 1;
               self._checkMembers();
               self._oOptionsArea.css( { 'visibility': 'visible' } );

               //set cookie
               $.cookie(self._sEnabledMenuCookieName, self._iMenuEnabled, {expires: self._iExpireCookieDays,  path: '/'});
            });
        }
    }

    /**
     * Change page mode
     *
     * @param sPageMode string
     * @param oButton object
     * @return void
     */
    eSASeOnlineMembers.prototype.changePageMode = function(sPageMode, oButton)
    {
        if( $(oButton).hasClass(this._sActiveButtonClass) ) {
            return;
        }

        //save visitor choise
        $.cookie(this._sCookieName, sPageMode, {expires: this._iExpireCookieDays,  path: '/'});

        //set as selected
        this._oOptionsArea.removeClass(this._sActiveButtonClass);
        $(oButton).addClass(this._sActiveButtonClass);

        //-- stop all updates --//
        this._stopUpdates();
        //--

        //-- hide all members and clean params --//
        this._oMembersArea.children('div').animate(
        {
            width: "0"
        }, this._iAnimationSpeed, function(){
            $(this).remove();
        });
      
        this._iCountMembers = 0;
        this._sMembersList  = '';
        this._sPageMode = sPageMode;
        this._checkMembers(false);
        //--
    }

    //--

    //-- PRIVATE METHODS --//

    /**
     * Stop ajax updates
     *
     * @return void
     */
    eSASeOnlineMembers.prototype._stopUpdates = function() {
        //-- stop all updates --//
        if(this._sAjaxDescriptior) {
            this._sAjaxDescriptior.abort();
        }

        clearTimeout(this._RefreshTimeHandler);
        //--
    }

    /**
     * String replace
     *
     * @param search string
     * @param replace string
     * @param subject string
     * @return string
     */
    eSASeOnlineMembers.prototype._str_replace = function(search, replace, subject) {
        var reg = new RegExp("^("+search+",)|,("+search+",)");
        return subject.replace(reg, replace);
    }

    /**
     * Check mew profiles  
     *
     * @param bUseRandom boolean
     * return void
     */
    eSASeOnlineMembers.prototype._checkMembers = function(bUseRandom)
    {
        if(!this._iMenuEnabled) {
            return;
        }

        var self = this;
        var _sRandom = Math.random(); 
        var sExtraParam = typeof bUseRandom != undefined && bUseRandom == false
            ? '&not_random=true'
            : '';

        this._sAjaxDescriptior = $.getJSON(this._sPageReceiver + '&_r=' + _sRandom + '&page_mode=' + this._sPageMode + '&members=' + this._sMembersList + sExtraParam, function(data){
           //process members
           if(data.members && data.members_id) {
               //process recived data
                var iResponseCount = data.members.length;
                self._iCountMembers += iResponseCount;

                //append new members
                for( var i = 0; i < iResponseCount; i++) 
                {
                   self._oMembersArea.append(data.members[i].content);
                }

                //remove all unwanted members and show new
                if(self._iCountMembers > self._iMaxCountMembers) {
                    var iDeleteCount = self._iCountMembers - self._iMaxCountMembers;
                    for(var i = 0; i < iDeleteCount;i++)
                    {
                       self._oMembersArea.children('div:not(:animated):first:visible').animate(
                       {
                            width: "0"
                       }, self._iAnimationSpeed, function(){
                            var iProfileId = parseInt( $(this).attr('profile') );
                            self._sMembersList = self._str_replace(iProfileId, ',', self._sMembersList);
                            $(this).remove();

                       });
                    }

                    self._iCountMembers = self._iCountMembers - iDeleteCount;

                    //display all recived profiles
                    self._oMembersArea.children('div:not(:animated):hidden').fadeIn(self._iAnimationSpeed);
                }
                else {
                    //display all recived profiles
                    self._oMembersArea.children('div:not(:animated):hidden').fadeIn(self._iAnimationSpeed);
                }

                self._sMembersList += data.members_id;
            }
            else {
              // TO DO: need to show here like this - Empty!
            }

            //start checking again
            self._RefreshTimeHandler = setTimeout(function(){
                self._checkMembers();
            }, self._iRefreshTime);
        });
    }

    //--
