/*global jQuery, console, document, aNewsSlider, reload */
jQuery.fn.toggleBonusView = function() {
    jQuery('a.gallery_view').each(function(){
        jQuery(this).toggleClass('gallery_on').toggleClass('gallery_off');
    });
    jQuery('a.list_view').each(function(){
        jQuery(this).toggleClass('list_on').toggleClass('list_off');
    });
};

function tracking_textsuche(tracking_s,tracking_page,tracking_count){
    tracking_s = tracking_s.replace(/[^ a-z0-9]/i, "-");
    if(tracking_s && tracking_page==1){
        //omniture-Aufruf zusammenbauen:
        var s=s_gi(s_account);
        s.eVar13=tracking_s;
        s.events='event21';
        s.linkTrackVars='eVar13,events';
        s.linkTrackEvents='event21';
        s.tl(this,'o','Praemiensuche');
    }else{
        
    }
}

function tracking_praemienkategorie(tracking_s){
    tracking_s = tracking_s.replace(/[^ a-z0-9]/i, "-");
    //omniture-Aufruf zusammenbauen:
    var s=s_gi(s_account);
    s.prop11=tracking_s;
    s.linkTrackVars='prop11';
    s.tl(this,'o','Praemienkategorie');
}



jQuery(document).ready(function() {
    tracking_textsuche(tracking_s,tracking_page,tracking_count);
    
	Array.prototype.in_array = function(needle) {
	    for (var i=0; i<this.length; i++){
	        if (needle === this[i]) {
	            return true;
	        }
	    }
	    return false;
	};
	
	var steps			= 100; // slider steps between min and max values
    var leftstart		= jQuery.bonusFilter.WEBMILES_MIN_THRESHOLD; // min value of miles slider
    var leftstart2		= jQuery.bonusFilter.WEBMILES_MAX_AMOUNT;   // min value of amount slider
    var rightstart		= jQuery.bonusFilter.WEBMILES_MAX_THRESHOLD; // max value of miles slider
    
    var inputMilesFrom	= jQuery('input#MilesFrom');
    var inputMilesTo	= jQuery('input#MilesTo');
    var inputAmount		= jQuery('input#Amount');
    var milesSlider		= jQuery('#miles_slider');
    var amountSlider	= jQuery('#miles_slider_2');
    
    if (inputMilesFrom.val() !== '') {
        leftstart = inputMilesFrom.cleanval();
    }
    inputMilesFrom.val(jQuery.string(leftstart).decFormat());
    
    if (inputMilesTo.val() !== '') {
        rightstart = inputMilesTo.cleanval();
        inputMilesTo.val(jQuery.string(rightstart).decFormat());
        jQuery.bonusFilter.setMiles([leftstart, rightstart]);
    } else {
    	inputMilesTo.val('>' + jQuery.string(rightstart).decFormat());
    }
    
    if (inputAmount.val() !== '') {
        leftstart2 = inputAmount.cleanval();
        inputAmount.val(jQuery.string(leftstart2).decFormat());
    }
    
    jQuery('form#filterbonus').submit(function(){
        jQuery.bonusFilter.criteriaSearch();
    });
    
    jQuery('form#searchbonus').submit(function() {
        //console.log('searchtext');
        jQuery.bonusFilter.setSearchTerm(jQuery('form#searchbonus input#s').val());
        jQuery.bonusFilter.textSearch();
        return false;
    });

    jQuery('a.bonus_search_form_category_link').click(function() {
        if(jQuery(this).hasClass('checked')){
            jQuery(this).removeClass('checked');
            jQuery(this).addClass('unchecked');
        }else{
            jQuery(this).removeClass('unchecked');
            jQuery(this).addClass('checked');
            tracking_praemienkategorie(jQuery(this).getUrlParam("cate[]"));
        }
        jQuery.bonusFilter.setPage(1);
        jQuery.bonusFilter.criteriaSearch();
        return false;
    });
    
    jQuery('a#reset_categories').click(function(){
        jQuery('form#filterbonus').find("a.checked").each(function() {
            jQuery(this).removeClass('checked');
            jQuery(this).addClass('unchecked');
        });
        jQuery.bonusFilter.blocked = true;
        inputMilesFrom.val('1');
        jQuery.bonusFilter.blocked = true;
        inputMilesTo.val('>' + jQuery.bonusFilter.WEBMILES_MAX_THRESHOLD);
        
        if (inputAmount && inputAmount.length) {
        	jQuery.bonusFilter.blocked = true;
        	inputAmount.val('0');
        }
        
        jQuery.bonusFilter.blocked = true;
        milesSlider.slider('values', 0, jQuery.bonusFilter.WEBMILES_MIN_THRESHOLD);
        jQuery.bonusFilter.blocked = true;
        milesSlider.slider('values', 1, jQuery.bonusFilter.WEBMILES_MAX_THRESHOLD);
        
        if (amountSlider && amountSlider.length) {
        	jQuery.bonusFilter.blocked = true;
        	amountSlider.slider('value', jQuery.bonusFilter.WEBMILES_MAX_AMOUNT);
        } else {
        	jQuery.bonusFilter.blocked = false;
        }
        
        jQuery.bonusFilter.setMiles([jQuery.bonusFilter.WEBMILES_MIN_THRESHOLD, jQuery.bonusFilter.WEBMILES_MAX_THRESHOLD]);
        jQuery.bonusFilter.criteriaSearch();
        return false;
    });
	
    jQuery('form.list_count select').change(function(){
         //console.log('count_select');
        jQuery('form.list_count select').val(jQuery(this).val());
        jQuery.bonusFilter.setSearchTerm(jQuery('form#searchbonus input#s').val());
        jQuery.bonusFilter.setPage(1);
        jQuery.bonusFilter.setResultsOnPage(jQuery(this).val());

        if (jQuery('#s').val() === '') {
          jQuery.bonusFilter.criteriaSearch();
        }
        else {
          console.log('txt');
          jQuery.bonusFilter.textSearch();
        }
        //jQuery.bonusFilter.criteriaSearch();
    });
    var sortDirection = ['off', 'up', 'down'];
    jQuery('a.price').click(function(){
        jQuery('a.name').removeClass(sortDirection[1]).removeClass(sortDirection[2]).addClass(sortDirection[0]);
        if (jQuery(this).attr('class').match(sortDirection[2]) == sortDirection[2]) {
            jQuery(this).toggleClass(sortDirection[2]);
            jQuery(this).toggleClass(sortDirection[1]);
	        jQuery.bonusFilter.setSortBy('price');
	        jQuery.bonusFilter.setSortOrder('desc');
        } else if (jQuery(this).attr('class').match(sortDirection[1]) == sortDirection[1]) {
            jQuery(this).toggleClass(sortDirection[1]);
            jQuery(this).toggleClass(sortDirection[2]);
            jQuery.bonusFilter.setSortBy('price');
            jQuery.bonusFilter.setSortOrder('asc');
        } else if (jQuery(this).attr('class').match(sortDirection[0]) == sortDirection[0]) {
            jQuery(this).toggleClass(sortDirection[0]);
            jQuery(this).toggleClass(sortDirection[2]);
            jQuery.bonusFilter.setSortBy('price');
            jQuery.bonusFilter.setSortOrder('asc');
        }
        jQuery.bonusFilter.search();
        return false;
    });
    jQuery('a.name').click(function(){
        jQuery('a.price').removeClass(sortDirection[1]).removeClass(sortDirection[2]).addClass(sortDirection[0]);
        if (jQuery(this).attr('class').match(sortDirection[2]) == sortDirection[2]) {
            jQuery(this).toggleClass(sortDirection[2]);
            jQuery(this).toggleClass(sortDirection[1]);
            jQuery.bonusFilter.setSortBy('name');
            jQuery.bonusFilter.setSortOrder('desc');
        } else if (jQuery(this).attr('class').match(sortDirection[1]) == sortDirection[1]) {
            jQuery(this).toggleClass(sortDirection[1]);
            jQuery(this).toggleClass(sortDirection[2]);
            jQuery.bonusFilter.setSortBy('name');
            jQuery.bonusFilter.setSortOrder('asc');
        } else if (jQuery(this).attr('class').match(sortDirection[0]) == sortDirection[0]) {
            jQuery(this).toggleClass(sortDirection[0]);
            jQuery(this).toggleClass(sortDirection[2]);
            jQuery.bonusFilter.setSortBy('name');
            jQuery.bonusFilter.setSortOrder('asc');
        }
        var type = jQuery.bonusFilter.getCurrentSearch();
        jQuery.bonusFilter.search(type);
        return false;
    });
    
    jQuery('a.gallery_view').bind('click', function(){
        jQuery('a.gallery_view').toggleBonusView();
        jQuery.bonusFilter.setResultView('gallery');
        jQuery.bonusFilter.search();
        return false;
    });
    jQuery('a.list_view').bind('click', function(){
        jQuery('a.list_view').toggleBonusView();
        jQuery.bonusFilter.setResultView('list');
        jQuery.bonusFilter.search();
        return false;
    });
    
    jQuery('ul.pagination li a').click(function(){
        jQuery.bonusFilter.initPager(jQuery(this));
        return false;
    });
    
    
    inputMilesFrom.bind('change', function() {
    	jQuery.bonusFilter.blocked = false;
        if (Number(jQuery(this).cleanval()) >= Number(inputMilesTo.cleanval())) {
        	jQuery.bonusFilter.blocked = true;
        	inputMilesTo.focus().text('');
        } else {
        	milesSlider.slider('values', 0, Number(inputMilesFrom.cleanval()));
        }
    });
    inputMilesTo.bind('change', function() {
        if (Number(jQuery(this).cleanval()) <= Number(inputMilesFrom.cleanval())) {
            jQuery(this).val(Number(inputMilesFrom.cleanval()) + steps);
        }
        if (jQuery.bonusFilter.blocked) {
			var tmpFrom = Number(inputMilesFrom.cleanval());
			milesSlider.slider('values', 1, Number(jQuery(this).cleanval()));
	       	jQuery.bonusFilter.blocked = false;
	       	milesSlider.slider('values', 0, tmpFrom);
        } else {
        	milesSlider.slider('values', 1, Number(jQuery(this).cleanval()));
        }
    });
    inputAmount.bind('change', function(){
    	amountSlider.slider('value', Number(inputAmount.cleanval()));
    });
    
    milesSlider.slider({
        min: 0,
        max: jQuery.bonusFilter.WEBMILES_MAX_THRESHOLD,
        step: jQuery.bonusFilter.WEBMILES_MAX_THRESHOLD / steps,
        range: true,
        change: function(args, ui) {
        	if (!jQuery.bonusFilter.blocked) {
            	jQuery.bonusFilter.setMiles([ui.values[0], ui.values[1]]);
            	jQuery.bonusFilter.setAmount(inputAmount.cleanval());
            	jQuery.bonusFilter.search();
			}
        },
        values: [leftstart, rightstart],
        slide: function(e, ui) {
            var left = ui.values[0];
            var right = ui.values[1];
            inputMilesFrom.val(jQuery.string(left).decFormat());
            
            if (left < right) {
            	jQuery.bonusFilter.blocked = false;
            } else {
            	jQuery.bonusFilter.blocked = true;
            }
            
            if (right == jQuery.bonusFilter.WEBMILES_MAX_THRESHOLD) {
            	inputMilesTo.val('>' + jQuery.string(jQuery.bonusFilter.WEBMILES_MAX_THRESHOLD).decFormat());
            } else {
            	inputMilesTo.val(jQuery.string(right).decFormat());
            }
        }       
    });

    amountSlider.slider({
        min: 0,
        max: jQuery.bonusFilter.WEBMILES_MAX_AMOUNT,
        step: steps,
        value: parseInt(leftstart2),
        change: function(args, ui) {
            jQuery.bonusFilter.setAmount(ui.value);
            jQuery.bonusFilter.search();
        },
        slide: function(e, ui) {
            var left = ui.value;
            if (!left)
            {
            	inputAmount.val('0');
            }
            else
            {
            	inputAmount.val(jQuery.string(left).decFormat());
            }
        }       
    });
});

(function ($) {
  $.fn.cleanval = function () {
	  return jQuery.string(this.val()).decClean();
  };
})(jQuery);

jQuery.bonusFilter = {
    WEBMILES_MAX_THRESHOLD: 10000,
    WEBMILES_MIN_THRESHOLD: 100,
    WEBMILES_MAX_AMOUNT: 1000,
    allParams: '',
    reload: false,
    categories: [],
    resultViews: ['gallery', 'list'],
    resultView: '',
    searchTerm: '',
    pager: ['15', '25', '50', '100'],
    miles: ['1', this.WEBMILES_MAX_THRESHOLD],
    amount: '0',
    resultsOnPage: 15,
    sortBy: 'price',
    sortOrder: 'asc',
    currentSearch: 'criteria',
    page: '1',
    blocked: false,
    setPage: function(page) {
        this.page = page;
    },
    getCurrentSearch: function() {
        return this.currentSearch;
    },
    setReload: function(args) {
        if (args !== false) {
            reload = true;
        } else {
            reload = false;
        }
    },
    setSortBy: function(by) {
        this.sortBy = by;
    },
    setSortOrder: function(order) {
        this.sortOrder = order;
    },
    setResultsOnPage: function(args) {
        if (jQuery.bonusFilter.pager.in_array(args)) {
            jQuery.bonusFilter.resultsOnPage = args;
        }
        //console.log(jQuery.bonusFilter.resultsOnPage);
    },
    setSearchTerm: function(search) {
        if (typeof(search) == 'string' && search.length > 0) {
            jQuery.bonusFilter.searchTerm = search;
        } else {
        	jQuery.bonusFilter.searchTerm = '';
        }
    },
    setMiles: function(args) {
        this.miles = args;
    },
    setAmount: function(args) {
        this.amount = args;
    },
    addCategories: function() {
        jQuery.bonusFilter.categories = [];
        jQuery('form#filterbonus').find("a.checked").each(function() {
            if (!jQuery.bonusFilter.categories.in_array('cate[]=' + this.name.slice(5))) {
                jQuery.bonusFilter.categories.push('cate[]=' + this.name.slice(5));
            }
        });
    },
    setResultView: function(args) {
        if (typeof(args) != 'string' || args.length <= 0) {
	        for (var i in jQuery.bonusFilter.resultViews) {
	            if (jQuery('a.' + jQuery.bonusFilter.resultViews[i] + '_on').length > 0) {
	                jQuery.bonusFilter.resultView = jQuery.bonusFilter.resultViews[i];
	            }
	        }
        } else if (jQuery.bonusFilter.resultViews.in_array(args)) {
            jQuery.bonusFilter.resultView = args;
        }
    },
    criteriaSearch: function() {
        //console.log('doing a criteria search');
        jQuery('#s').val('');
        if (this.blocked === true) {
            this.blocked = false;
            return false;
        }
        
        this.addCategories();
        this.currentSearch = 'criteria';
        if (this.miles[1] == this.WEBMILES_MAX_THRESHOLD) {
            this.setMiles([this.miles[0], null]);
        }
        jQuery.bonusSearch.call('&listView=' + this.resultView + 
                                '&' + this.categories.join('&') + 
                                '&MilesFrom=' + this.miles[0] + 
                                '&MilesTo=' + this.miles[1] +
                                '&Amount=' + this.amount +
                                '&sortBy=' + this.sortBy +
                                '&sortOrder=' + this.sortOrder +
                                '&listCount=' + this.resultsOnPage + 
                                '&page=' + this.page +
                                '&reload=' + this.reload);
    },
    textSearch: function() {
        //console.log('doing a text search');
        //console.log(this.searchTerm);
        jQuery('a.bonus_search_form_category_link').addClass('unchecked').removeClass('checked');
        if (this.searchTerm === '') {
            return false;
        }
        
        this.currentSearch = 'text';
        jQuery.bonusSearch.call('&listView=' + this.resultView + 
                                '&s=' + this.searchTerm + 
                                '&MilesFrom=' + this.miles[0] + 
                                '&MilesTo=' + this.miles[1] +
                                '&sortBy=' + this.sortBy +
                                '&sortOrder=' + this.sortOrder +
                                '&listCount=' + this.resultsOnPage + 
                                '&page=' + this.page +
                                '&reload=' + this.reload);
    },
    search: function() {
        var searchCall = this.currentSearch + 'Search';
        this.searchTerm = jQuery('#s').val(); 
        if (this.searchTerm === '') {
        	searchCall = 'criteriaSearch';
        }
        else {
          searchCall = 'textSearch';
        }
        eval('this.' + searchCall + '()');
    },
    initPager: function(clicked) {
    	var parsedUrl = clicked.attr('href').split("/");
        for (var part in parsedUrl) {
            if (parsedUrl[part] == 'page') {
                var next = Number(part, 0) + 1;
            }
        }
        jQuery.bonusFilter.setPage(parsedUrl[next]);
        jQuery.bonusFilter.search();
    },
    initNewsSlider: function() {
    	//da kein Slider verwendet wird, gibt es nichts zu initialisieren
    }
};

jQuery.bonusSearch = {
    resultViews: ['gallery', 'list'],
    call: function(allParams) {
        jQuery.post('bonus/bonus/bonus/format/json',
                allParams,
                function(data) {
                    var answer = eval(data);
                    try {
                        // @todo this must be possible in a shorter way
                        if (answer.data.scalar.resultView == 'gallery') {
                            jQuery('div#bonus_result_view').removeClass('bonus_list').addClass('bonus_gallery').html(answer.data.complex.bonusList);
                        } else if (answer.data.scalar.resultView == 'list') {
                            jQuery('div#bonus_result_view').addClass('bonus_list').removeClass('bonus_gallery').html(answer.data.complex.bonusList);
                        }
                        if (jQuery('p.intro').length > 0) {
                            jQuery('p.intro').replaceWith(answer.data.complex.introContent);
                        } else {
                            jQuery('a#content').append(answer.data.complex.introContent);
                        }
                        
                        tracking_textsuche(answer.data.scalar.s,answer.data.scalar.page,answer.data.scalar.count);

                        var hits = answer.data.scalar.categoryHits;
                        if(jQuery('ul.pagination').length > 0) {
                        	// ul.pagination darf nicht entfernt werden
                        	if(answer.data.scalar.paginator) {
                        		jQuery('ul.pagination').replaceWith(answer.data.scalar.paginator);
                        	} else {
                        		jQuery('ul.pagination li').remove();
                        	}
                        } else {
                        	jQuery('.view_switcher').append(answer.data.scalar.paginator);
                        }
                        
                        // newsslider vorhanden?
                        if (jQuery('div#teaser_noSearch')) {
                        	jQuery('div#teaser_noSearch').remove();
                        }
                        // newsslider laden wenn keine ergebnisse vorhanden
                        if (answer.data.complex.bonusSlider && !answer.data.scalar.count) {
                        	jQuery('div#col3_content').append(answer.data.complex.bonusSlider);
                        	
                        	//Es wird bonus/partials/bonus-grid.phtml eingebaut, deshalb braucht's kein initNewsSlider
                        	//jQuery.bonusFilter.initNewsSlider();
                        	
                        }
                        
					    jQuery('ul.pagination li a').click(function(){
					        jQuery.bonusFilter.initPager(jQuery(this));
					        return false;
					    });
					    
					    
                        //paginationLink();
                        jQuery(window).scrollTop(0);
                        tracking('praemien');
                    } catch(e) {
                        jQuery('div#bonus_result_view').html("<p>Leider wurden keine Ergebnisse zu Ihrer Suche gefunden.</p>"); // '"' gesetzt, weil im Inhalt Apostrophe vorkommen können
                        //console.log(e.message);
                    }
                },
                "json");
    }
};
