var TableSort = new Class({

    resultTable : null,

    sortZipAsc : true,
    sortDistrictAsc : true,
    sortDistanceAsc : false,
    borderElement : null,

    init : function(resultTable){

        this.resultTable = resultTable;

        this.borderElement = new Element('tr');
        var td = new Element('td', { colspan :4});
        var hr = new Element('hr');

        hr.inject(td);
        td.inject(this.borderElement);

        this.createSortLinks();
    },

    createSortLinks : function(){


        if($("sort-zip")){
            $("sort-zip").addEvent('click', function(event){
                
                var results = this.resultTable.getElements('tr.branch-item').clone();

                results.sort(this.sortWithZip.bind(this));

                if(this.sortZipAsc){
                    $("sort-zip").removeProperty('class');
                    $("sort-zip").setProperty('class', 'fleft up');
                }else {
                    $("sort-zip").removeProperty('class');
                    $("sort-zip").setProperty('class', 'fleft down');
                }

                this.sortZipAsc = !this.sortZipAsc;
                this.fillTableWithBranchItems(results);

            }.bindWithEvent(this));
        }

        if($("sort-district")){
            $("sort-district").addEvent('click', function(event){

                var results = this.resultTable.getElements('tr.branch-item').clone();

                results.sort(this.sortWithDistrict.bind(this));

                if(this.sortDistrictAsc){
                    $("sort-district").removeProperty('class');
                    $("sort-district").setProperty('class', 'fleft up');
                }else {
                    $("sort-district").removeProperty('class');
                    $("sort-district").setProperty('class', 'fleft down');
                }

                this.sortDistrictAsc = !this.sortDistrictAsc;
                this.fillTableWithBranchItems(results);

            }.bindWithEvent(this));
        }

        if($("sort-distance")){
            $("sort-distance").addEvent('click', function(event){

                var results = this.resultTable.getElements('tr.branch-item').clone();

                results.sort(this.sortWithDistance.bind(this));

                if(this.sortDistanceAsc){
                    $("sort-distance").removeProperty('class');
                    $("sort-distance").setProperty('class', 'fleft up');
                }else {
                    $("sort-distance").removeProperty('class');
                    $("sort-distance").setProperty('class', 'fleft down');
                }

                this.sortDistanceAsc = !this.sortDistanceAsc;
                this.fillTableWithBranchItems(results);

            }.bindWithEvent(this));
        }
    },

    fillTableWithBranchItems : function(results){

      var itemList = this.resultTable.getElement('.branch-item-list');
      itemList.empty();
            
      results.each(function(item, index, array){

        item.inject(itemList);

        if(index+1 < array.length){
          this.borderElement.clone().inject(itemList);
        }

      },this);
    },

    //Sort methods
    sortWithZip : function(a, b){

        if(this.sortZipAsc){
            return a.getElement('.sort-zip-value').get('text') - b.getElement('.sort-zip-value').get('text')

        }else {
            return b.getElement('.sort-zip-value').get('text') - a.getElement('.sort-zip-value').get('text') 
        }
    },

    sortWithDistrict : function(a, b){
         if(this.sortDistrictAsc){
            if(a.getElement('.sort-district-value').get('text') > b.getElement('.sort-district-value').get('text')){
                return 1;
            }else {
                return -1;
            }

            return 0;
        }else {
             if(a.getElement('.sort-district-value').get('text') < b.getElement('.sort-district-value').get('text')){
                return 1;
            }else {
                return -1;
            }

            return 0;
        }
    },

    sortWithDistance : function(a, b){
         if(this.sortDistanceAsc){
            return parseFloat(a.getElement('.sort-distance-value').get('text')) - parseFloat(b.getElement('.sort-distance-value').get('text'))
           
        }else {
            return parseFloat(b.getElement('.sort-distance-value').get('text')) - parseFloat(a.getElement('.sort-distance-value').get('text'))
        }
    }
});

var ServiceFilter = new Class({

    serviceConatiner : null,
    serviceFilterForm : null,
    activeServices : [],
    buttonActiveClass : 'on',

    init : function(serviceForm, serviceContainer){
        this.serviceContainer = serviceContainer;
        this.serviceFilterForm = serviceForm;

        this.getActiveServices();

        this.setClickEvent();

     
        this.serviceFilterForm.addEvent('submit', this.submitForm.bindWithEvent(this));
    },

    setClickEvent : function(){

        this.serviceContainer.getElements('div.service-item').each(function(item){
            item.addEvent('click', this.clickButton.bindWithEvent(this));

            var service_id = item.getElement('span.service-id')

            if(service_id){
                service_id = service_id.get('text');

                if(this.activeServices.indexOf(service_id) != -1){
                    item.addClass(this.buttonActiveClass);
                }
            }

        },this);
    },

    getActiveServices : function(){

        var inputElement = $('service-id-list');

        if(inputElement){
             this.activeServices = inputElement.getProperty('value').split(',');
        }
    },

    clickButton : function(event){

        var el = $(event.target);
        var service_id;

        if(el.get('tag') == 'img'){
            el = el.getParent();
        }

        service_id = el.getElement('span.service-id');

        if(service_id){
            service_id = service_id.get('text');
        }

        if(service_id && el){

            //The service is already activated
            if(el.hasClass(this.buttonActiveClass)){
                this.activeServices.erase(service_id);
                el.removeClass(this.buttonActiveClass);
            }else {
                this.activeServices.push(service_id);
                el.addClass(this.buttonActiveClass);
            }

        }

        console.debug(this.activeServices);
    },

   submitForm : function(){

        var inputElement = $('service-id-list');

        if(inputElement){
            inputElement.setProperty('value', this.activeServices.toString());
        }
   }
});

window.addEvent('domready', function()    {
    if($('store-finder-results')){
        $('store-finder-results').budnibranchdb_tableSort = new TableSort();
        $('store-finder-results').budnibranchdb_tableSort.init($('store-finder-results'));

        var itemList = $('store-finder-results').getElement('.branch-item-list');
        if(itemList){
            itemList.getLast('tr').dispose();
        }
    }

    if($('service-filter-form') && $('sortiment-item-list')){
        $('service-filter-form').budnibranchdb_serviceFilter = new ServiceFilter();
        $('service-filter-form').budnibranchdb_serviceFilter.init($('service-filter-form'), $('sortiment-item-list'));
    }
});
