﻿if (!AtmsOffices)
{ 
    var AtmsOffices = function() { };
}

/* ���-� �� ���������� ������ node � jQuery-������ */
AtmsOffices.HasClass = function( element, className )
{
    return ( element.className == className ||
             element.className.indexOf( className + " " ) > -1 ||
             element.className.match( " " + className + "$" ) == " " + className )
}

/* ��� ��� ������ ������ jQuery, ������� �� ����� ��� hasClass() */  
if ( !jQuery.prototype.hasClass ) 
{
    jQuery.prototype.hasClass = function( className ) 
    {
        var result = false;
        for ( var i = 0; i < this.length; i++)
        {
            if ( AtmsOffices.HasClass( this[i], className ) )
            {
                result = true;
                break;
            }
        }
        
        return result;
    }
}
    
/* ����-�� ��� ��� ��������� � hash �����-���� �������� */
AtmsOffices.MetroFilter = function( stationsContainerSelector, // jQuery-�������� ���������� ������� �����
                                    stationsSelector,          // jQuery-�������� ���� ������� ����� (��� ������ ����������)
                                    elementsContainerSelector, // jQuery-�������� ���������� ��������� ��� ����������
                                    elementsSelector,          // jQuery-�������� ��������� (��� ������ ����������)
                                    classFilteredContainer,    // ����� "������ �������" (����������� � ����������)
                                    classFilteredElement,      // ����� "������� �������� ��� ������� �������" (����������� � ��������)
                                    keyWordsContainerSelector) // jQuery-�������� ���������� � ��������� ������� (��� ������ ��������)
{ 
    this._stationsContainerSelector = stationsContainerSelector;
    this._stationsSelector          = stationsContainerSelector + " " + stationsSelector;

    this._elementsContainerSelector = elementsContainerSelector;
    this._elementsSelector          = elementsContainerSelector + " " + elementsSelector;
    
    this._classFilteredContainer    = classFilteredContainer;
    this._classFilteredElement      = classFilteredElement;
    
    this._elements                  = jQuery(this._elementsSelector);
    this._elementsContainer         = jQuery(this._elementsContainerSelector);
    this._stationsContainer         = jQuery(this._stationsContainerSelector);
    this._stations                  = jQuery(this._stationsSelector);
    
    this._handlersOnFilterEnd       = [];
    this._handlersOnFilterStart     = [];
    
    this._filterStationsTimer       = null;
    this._keywordsContainerSelector = keyWordsContainerSelector;
    
    _this = this;
    
    this._stations.click( function () {
        _this.FilterPoints( this.id );
    } );
}

AtmsOffices.MetroFilter.PREFIX_METRO_ID_CLASS = ".metro-";

AtmsOffices.MetroFilter.CLASS_PAGESEARCHER_FOUND = "found"; // �����, ������� PageSearch �������� ��������� ��������
AtmsOffices.MetroFilter.CLASS_PAGESEARCHER_FILTERED = "filtered"; // �����, ������� PageSearch �������� ��������� � ���������� ����������

AtmsOffices.MetroFilter.CLASS_24HOUR_FILTERED = "filter-h24";
AtmsOffices.MetroFilter.CLASS_HAS_REMPANT_FILTERED = "filter-has-rempant";
AtmsOffices.MetroFilter.CLASS_ACCEPT_CASH_FILTERED = "filter-money-take";
AtmsOffices.MetroFilter.SUFFIX_SUBFILTER_KEY = "-key";

AtmsOffices.MetroFilter.FILTER_STATIONS_DELAY = 0;

/* AtmsOffices.MetroFilter.KEYWORDS_CONTAINER_SELECTOR = "p.search-keywords span"; */ // �������� ���������� � ���������� ������ ��������

AtmsOffices.MetroFilter.prototype = {
    
    /* 
    ���������� �����.
    
    ��� �����, � ������� ��������� ����� .metro-{id �������� ������� �����}, ��������, ��� _classFilteredElement,
    ��������� �������� _classFilteredContainer 
    */
    FilterPoints : function ( stationId ) 
    {
        this._OnFilterStart();
        var filterSelector = AtmsOffices.MetroFilter.PREFIX_METRO_ID_CLASS + stationId;
        var elementsToFilter = this._elements.filter( filterSelector );
        
        this._elementsContainer.addClass( this._classFilteredContainer );
        this._elements.removeClass( this._classFilteredElement ); // ��������, ���� ����� ������
        elementsToFilter.addClass( this._classFilteredElement );  
        this._OnFilterEnd();     
    },
    
    /*
    ������� ������ �����.
    
    ������� � ���� ����� ����� _classFilteredElement, � ���� ��������� �� �������� ��������� � �������, 
    ������� _classFilteredContainer
    */
    ClearFilter : function () 
    {
        this._elementsContainer.removeClass( this._classFilteredContainer );
        this._elements.removeClass( this._classFilteredElement );
    },
    
    /*
    ���������� ������� ����� �� �����
    
    - ������ ���������� ������� ����� ����� _classFilteredContainer,
    - ��� ������ ����� ���� �������
    - ���� ���������� ����� ������ 0, �� ������ ������� ����� _classFilteredElement
    */
    FilterStations : function() 
    { 
        /* �����, ������������ ������ �� ����������, ����� ���� CSS ����������, ���� � xsl ���������� */
        this._stationsContainer.addClass( this._classFilteredContainer );
        
        _this = this;
        
        if (this._filterStationsTimer != null)
            clearTimeout(this._filterStationsTimer);
        
        this._filterStationsTimer = setTimeout( function () { _this._FilterStations() }, AtmsOffices.MetroFilter.FILTER_STATIONS_DELAY);
    },
    
    // ��� �������, ����������, � ��������� �������. ���������� �� �������, �������������� � FilterStations()
    // (��� ������ ������� �������� ��� �������� �� ������� � ����� ��� ������)
    _FilterStations : function () {
        /* �������� ��� ����� ����� */
        this._stations.removeClass( this._classFilteredElement );
        
        var isContainerFiltered = 
            this._elementsContainer.hasClass(AtmsOffices.MetroFilter.CLASS_PAGESEARCHER_FILTERED);
            
        var is24HourSelected =
            this._elementsContainer.hasClass(AtmsOffices.MetroFilter.CLASS_24HOUR_FILTERED);

		var isHasRempantSelected =
            this._elementsContainer.hasClass(AtmsOffices.MetroFilter.CLASS_HAS_REMPANT_FILTERED);

        
        var isAcceptCashSelected =
            this._elementsContainer.hasClass(AtmsOffices.MetroFilter.CLASS_ACCEPT_CASH_FILTERED);
            
        /* ���������� ��� �����, �� ��� ��, ������� �������� ����� ���������� PageSearch */
        
        // ��� ����� ��������, ����� ������� �� ��� �������� (���-� �� ������ ��� �� ��������)
        var visitedKeywords = {};
        
        /* Profiling timings */
        var timeTotal = 0;
        var timeTotalCount = 0;
        var timeElementAvg = 0;
        var timeElementAvgCount = 0;
        var timeSearchKeywordsAvg = 0;
        var timeSearchKeywordsAvgCount = 0;
        var timeSetClassAvg = 0;
        var timeSetClassAvgCount = 0;
        
        this._elements.each( function () 
        {
            var timeElementProcessStart = new Date();
            
            // ��������� ������� �� ��������� � ������ ������� ��������
            if ( 
                     ( !isContainerFiltered || AtmsOffices.HasClass( this, AtmsOffices.MetroFilter.CLASS_PAGESEARCHER_FOUND ) )
                  && ( !isAcceptCashSelected || AtmsOffices.HasClass( this, AtmsOffices.MetroFilter.CLASS_ACCEPT_CASH_FILTERED + AtmsOffices.MetroFilter.SUFFIX_SUBFILTER_KEY) )
                  && ( !is24HourSelected || AtmsOffices.HasClass (this, AtmsOffices.MetroFilter.CLASS_24HOUR_FILTERED + AtmsOffices.MetroFilter.SUFFIX_SUBFILTER_KEY) ) 
				  && ( !isHasRempantSelected || AtmsOffices.HasClass (this, AtmsOffices.MetroFilter.CLASS_HAS_REMPANT_FILTERED + AtmsOffices.MetroFilter.SUFFIX_SUBFILTER_KEY) ) 
                )
            {
                var timeKeywordsProcessStart = new Date();
                /* ���, ���� ������� �����! ���������� ��������������� ������� ����� */
                if ( !this.keywords )  // ���� ��� �� ���� �� ��������� ������, �������� id����� �������,
                                       // � �������� �� ������, ���-�� ����� �� ���������� ��
                {
                    var keyWords = '';
                    var keyWordsHash = '';
                    
                    var keyWordContainers = jQuery( this ).find( _this._keywordsContainerSelector );
                    keyWordContainers.each( function() 
                    {
                        keyWords += '#' + this.innerHTML + ',';
                        keyWordsHash += this.innerHTML + '_';
                    });
                    
                    keyWords = keyWords.substring(0, keyWords.length - 1);
                    keyWordsHash = keyWordsHash.substring(0, keyWordsHash.length - 1);
                    this.keywords = keyWords;
                    this.keywordsHash = keyWordsHash;
                }
                var timeKeywordsProcessEnd = new Date();
                timeSearchKeywordsAvg += ( timeKeywordsProcessEnd.getTime() - timeKeywordsProcessStart.getTime() );
                timeSearchKeywordsAvgCount++;
                
                var timeAddClassProcessStart = new Date();
                if ( !visitedKeywords[this.keywordsHash] )
                {
                    jQuery( this.keywords ).addClass( _this._classFilteredElement );
                    visitedKeywords[this.keywordsHash] = true;
                }
                var timeAddClassProcessEnd = new Date();
                timeSetClassAvg += ( timeAddClassProcessEnd.getTime() - timeAddClassProcessStart.getTime() );
                timeSetClassAvgCount++;
            }
            
            var timeElementProcessEnd = new Date();
            timeElementAvg += ( timeElementProcessEnd.getTime() - timeElementProcessStart.getTime() );
            timeElementAvgCount++;
        });
        
        this._OnFilterEnd();
        
        /* Profiling output */
        /* var timeDebugString = "Avg. element process time: " + (timeElementAvg / timeElementAvgCount) + " Total: " + timeElementAvg + "\n";
        timeDebugString += "Avg. keywords search time: " + ( timeSearchKeywordsAvg / timeSearchKeywordsAvgCount ) + " Total: " + timeSearchKeywordsAvg + "\n";
        timeDebugString += "Avg. addClass time: " + ( timeSetClassAvg / timeSetClassAvgCount ) + " Total: " + timeSetClassAvg; */
        
        /* alert( timeDebugString ); */
        
        /* console.log("Avg. element process time:", timeElementAvg / timeElementAvgCount);
        console.log("Avg. keywords search time:", timeSearchKeywordsAvg / timeSearchKeywordsAvgCount);
        console.log("Avg. addClass time:", timeSetClassAvg / timeSetClassAvgCount ); */
    },
    
    /* ��������� ����������, ������������� ����� �������� ���������� - ����, ����� ����� �� ��������� */
    OnFilterStart : function ( filterStartHandler ) 
    {
        this._handlersOnFilterStart[this._handlersOnFilterStart.length] = filterStartHandler;
    },
    
    /* ��������� ����������, ������������� ����� ��������� ���������� - ����, ���� ����� ����� �� ��������� */
    OnFilterEnd : function ( filterEndHandler ) 
    {
        this._handlersOnFilterEnd[this._handlersOnFilterEnd.length] = filterEndHandler;
    },
    
    /* �������� ����������� OnFilterStart */
    _OnFilterStart : function ()
    {
        for ( var i = 0; i < this._handlersOnFilterStart.length; i++)
            if ( this._handlersOnFilterStart[i] ) this._handlersOnFilterStart[i]();
    },
    
    /* �������� ����������� OnFilterEnd */
    _OnFilterEnd : function ()
    {
        for ( var i = 0; i < this._handlersOnFilterEnd.length; i++)
            if ( this._handlersOnFilterEnd[i] ) this._handlersOnFilterEnd[i]();
    }
}