var jQuery = jQuery || {};
var bm = bm || {};

bm.filterTrigger = (function ($) {
    var FilterTrigger = function (element, options) {
        this.$element = $(element);
        this.tagName = this.$element.prop('tagName');
        this.options = $.extend({}, FilterTrigger.DEFAULTS, options);
        this.init();
    }

    FilterTrigger.VERSION = '1.0.1';

    FilterTrigger.DEFAULTS = {
        filter: {}
    };

    FilterTrigger.prototype.init = function () {
        this.$element.data('bm.filterTrigger', this);
        addEvents.call(this);
        //this.update();
    };

    FilterTrigger.prototype.update = function (options) {
        if (options) {
            options.filter = $.extend({}, this.options.filter, options.filter);
        }
        this.options = $.extend({}, this.options, options);

        this.$element.data('options', this.options);

        switch (this.tagName) {
            case 'INPUT':
                updateInput.call(this);
                break;
            case 'BUTTON':
                updateButton.call(this);
                break;
            case 'DIV':
                updateDiv.call(this);
                break;
            case 'SELECT':
                updateSelect.call(this);
                break;
            default:
                updateDefault.call(this);
                break;
        }

        var updatedEvent = $.Event('updated.bm.filterTrigger', {
            relatedTarget: this
        });
        this.$element.trigger(updatedEvent);

        return false;
        $(window).trigger('resize');

    };

    var addEvents = function () {
        var self = this;
        var observer = this.$element.data('observer');

        switch (this.tagName) {
            case 'INPUT':
                var inputType = this.$element.attr('type');
                switch (inputType) {
                    case 'checkbox':
                        this.$element.on('change', checkboxHandler);
                        break;
                }
                break;
            case 'BUTTON':
                this.$element.click(clickHandler);
                break;
            case 'DIV':
                this.$element.click(clickHandler);
                break;
            case 'SELECT':
                this.$element.on('change', selectHandler);
                //updateSelect.call(this);
                break;
            default:
                this.$element.click(clickHandler);
                break;
        }
    }

    var updateButton = function () {
        var filterType = this.$element.attr('data-filter-type');
        var filterValues = this.options.filter[filterType] || 'all';
            filterValues = filterValues.split(',');
        var itemFilterValue = this.$element.attr('data-filter-show');

        if (filterValues.indexOf(itemFilterValue) > -1) {
            this.$element.addClass('active')
        } else {
            this.$element.removeClass('active')
        }
        //var filterGroups = options.filter;
    };

    var updateSelect = function() {
        var self = this;
        var filterType = this.$element.attr('data-filter-type');
        var filterValues = this.options.filter[filterType] || 'all';
            filterValues = filterValues.split(',');

        this.$element.data('filterValues', []);
        this.$element.children('option').each(function(){
            var itemFilterValue = $(this).attr('value');
            if (filterValues.indexOf(itemFilterValue) > -1) {
                self.$element.data('filterValues').push(itemFilterValue);
                $(this).prop('selected', true);
            } else {
                $(this).prop('selected', false);
            }
        })
        if (this.$element.hasClass('selectpicker')){
            this.$element.selectpicker('refresh');
        }

    }
    var updateInput = function () {
        var inputType = this.$element.attr('type');
        switch (inputType) {
            case 'checkbox':
                updateInputCheckbox.call(this);
                break;
        }

    };

    var updateInputCheckbox = function () {

        var filterType = this.$element.attr('name');
        var filterValues = this.options.filter[filterType] || 'all';
        filterValues = filterValues.split(',');
        var itemFilterValue = this.$element.attr('value');

        if (filterValues.indexOf(itemFilterValue) > -1) {
            this.$element.prop('checked', true)
        } else {
            this.$element.prop('checked', false)
        }
    }

    var updateDiv = function () {
        var filterType = this.$element.attr('data-filter-type');
        var filterValues = this.options.filter[filterType] || 'all';
        filterValues = filterValues.split(',');
        var itemFilterValue = this.$element.attr('data-filter-show');

        if (filterValues.indexOf(itemFilterValue) > -1) {
            this.$element.addClass('active')
        } else {
            this.$element.removeClass('active')
        }
    }

    var updateDefault = function () {
       // console.log('updateDefault', this.tagName, this.options);
    };



    var clickHandler = function(e){
        var $this = $(this);
        var $target = $($this.attr('data-observer'));
        if (!$target.hasClass('js-filterObserver')) {
            return;
        }
        var filterType = $this.data('filter-type') || 'categories';
        var filter = {};
        filter[filterType] = $this.data('filter-show');
        var options = {filter: filter};
        $target.filterobserver(options);

        e.preventDefault();
    }

    var checkboxHandler = function (e) {
        var $this = $(this);
        var $target = $($this.attr('data-observer'));
        if (!$target.hasClass('js-filterObserver')) {
            return;
        }
        var filterType = $this.attr('name') || 'categories';
        var filter = {};
        filter[filterType] = $this.attr('value');
        var options = {filter: filter};
        $target.filterobserver(options);

        e.preventDefault();
    }

    var selectHandler = function (e) {
        var $this = $(this);
        var $target = $($this.attr('data-observer'));

        if (!$target.hasClass('js-filterObserver')) {
            return;
        }
        var filterType = $this.data('filter-type') || 'categories';
        var filter = {};

        filter[filterType] = $this.val().join(',');
        var options = {filter:filter, replace:true};
        $target.filterobserver(options);

        e.preventDefault();
    };


    // FilterTrigger PLUGIN DEFINITION
    // ==========================

    function Plugin(option) {
        return this.each(function () {
            var $this = $(this);
            var pluginData = $this.data('bm.filterTrigger');

            if (!pluginData) {
                var options = $.extend({}, FilterTrigger.DEFAULTS, $this.data(), typeof option === 'object' && option);

                pluginData = new FilterTrigger(this, options);
                $this.data('bm.filterTrigger', pluginData);
            } else {
                if (typeof option === 'string') {
                    pluginData[option]();
                } else {
                    pluginData.update(option);
                }
            }
        });
    }

    var old = $.fn.filtertrigger;

    $.fn.filtertrigger = Plugin;
    $.fn.filtertrigger.Constructor = FilterTrigger;


    // Contentfilter NO CONFLICT
    // ====================

    $.fn.filtertrigger.noConflict = function () {
        $.fn.filtertrigger = old;
        return this;
    };
}(jQuery));
