/**
 * Creates products filters based on their attributes (eg. producer, price, color, side, etc.)
 *
 * @author: Dariusz Pobożniak | http://pobozniak.pl
 * @copyright: Dariusz Pobożniak | http://pobozniak.pl
 * @date: 2010-03-22
 *
 */

var Filter = {};

$(function() {
    if ($('#home').length < 1 && $('.productview').length > 0) {
        Filter.init();
        filterKind();
        changeProductView();
        $('#filterform fieldset').lessMore({element: 'p', limit: 5});
    }
});

Filter = {
    arrayOfValues : [],
    products : [],
    filters : [],
    final : [],
    className: '',
    prodWrap: '.productview',
    
    unique: function(a) {
        tmp = new Array(0);
        for(i=0;i<a.length;i++){
            if(!this.contains(tmp, a[i])){
                tmp.length+=1;
                tmp[tmp.length-1]=a[i];
            }
        }
        return tmp;
    },

    contains: function(a, e) {
        for(j=0;j<a.length;j++) {
            if(a[j]==e) {
                return true;
            }
        }
        return false;
    },

    findMinMax: function(list, kind) {
        var k; var r; var left; var right;
        k = Math.floor(list.length/2);
        if (k > 0) {
            left = list.slice(0,k);
            right = list.slice(k,list.length);
            if (kind == 'max') {
                r = Math.max(this.findMinMax(left, kind),this.findMinMax(right, kind));
            }
            else if (kind == 'min') {
                r = Math.min(this.findMinMax(left, kind),this.findMinMax(right, kind));
            }
        } else {
            r=list[0];
        }
        return(r);
    },

    in_array: function(string, array) {
        for	(var i=0; i<array.length; i++) {
            if (array[i] == string) {
                return true;
            }
        }
        return false;
    },

    init: function() {
        if ($('li', this.prodWrap).length) {
            var noprodsmsg = $('<p />', {
                id : 'noprodsmsg',
                text: 'Nie znaleziono produktów spełniających warunki filtrowania'
            }).hide();
            $('#content .content').append(noprodsmsg);
            
            $('li', Filter.prodWrap).addClass('visible');
            var stringOfClassNames = '';
            var stringOfSpanValues = '';
            $('li:visible .parameters span', Filter.prodWrap).each(function() {
                var $span = $(this);
                stringOfClassNames += $span.attr('class') + ' - ' + $span.attr('rel') + ', ';
                stringOfSpanValues += $span.attr('class') + ' - ' + $span.text() + ', ';
            });
            var arrayClasses = stringOfClassNames.split(', ');
            arrayClasses.pop();
            var arrayUniqueClasses = this.unique(arrayClasses);
    
            var arraySpan = stringOfSpanValues.split(', ');
            var arrayUniqueSpan = this.unique(arraySpan);
    
            $('#sidenav').after('<form action="#" method="post" id="filterform"></form>');
    
            if (arrayUniqueClasses.length) {
                // then build the fieldsets based on all the class names
                $.each(arrayUniqueClasses, function() {
                    var cl = this.split(' - ');
                    $('<fieldset id="'+cl[0]+'-check"><h3>'+cl[1]+'</h3> <span class="clear" title="Wyczyść filtr">wyczyść</span></fieldset>').appendTo('#filterform');
                    Filter.filters.push(cl[0]);
                    Filter.products[cl[0]] = [];
                });
            }
            if (arrayUniqueSpan.length) {
                // then build the filter checkboxes based on all the span names
                var max_price = 0;
                var price_array = [];
                $.each(arrayUniqueSpan, function() {
                    var ab = this.split(' - ');
                    if (ab[0] != 'price') {
                        $('<p><input type="checkbox" value="'+ab[1]+'" id="filterID'+ab[1]+'" /><label for="filterID'+ab[1]+'">'+ab[1]+'</label></p>').appendTo('fieldset#'+ab[0]+'-check');
                    } else {
                        price_array.push(ab[1]);
                    }
                });
                if (price_array.length > 1) {
                    // maximum price
                    var maxVal = Filter.findMinMax(price_array, 'max').toFixed(2);
                    // minimum price
                    var minVal = this.findMinMax(price_array, 'min').toFixed(2);
                    // length of each range
                    var minusa = Math.ceil((maxVal - minVal)/5).toFixed(2);
                    // first range (initiation)
                    var prev = Math.ceil(parseFloat(minVal)+parseFloat(minusa))-0.01;
                    var minus_string = Math.floor(minVal).toFixed(2) + ' - ' + prev + '|';
                    for (var i=0; i<4; i++) {
                        var ama = (parseFloat(prev+0.01)+parseFloat(minusa));
                        ama = ama.toFixed(2)-0.01;
                        if (i==3 && ama<maxVal) {
                            ama = maxVal;
                        }
                        minus_string +=  (prev+0.01).toFixed(2) + ' - ' + ama + '|';
                        prev = ama;
                    }
                    // convert string to array
                    minus_string = minus_string.split('|');
                    // delete last empty element
                    minus_string.pop();
                    // display price ranges
                    $.each(minus_string, function(i) {
                        var range = this;
                        $('<p><input type="checkbox" value="'+this+'" id="filterPrice'+i+'" disabled="disabled" /><label for="filterPrice'+i+'">'+this+'</label></p>').appendTo('fieldset#price-check');
                        $('.parameters .price', Filter.prodWrap).each(function() {
                            var producer = $(this).text();
                            var price_range = range.split(' - ');
                            var min_val = parseFloat(price_range[0]);
                            var max_val = parseFloat(price_range[1]);
                            if (producer >= min_val && producer <= max_val) {
                                $(this).after('<span class="priceRange">filterPrice'+i+'</span>');
                                $('#filterPrice'+i).removeAttr('disabled');
                            }
                        });
                    });
                } else {
                    $('#price-check').remove();
                }
            }
            this.startFilter();
            Filter.getFilterCookie();
        }
    },
    
    setArrayOfValues: function(obj) {
        var value = $(obj).val();
        this.className = $(obj).parents('fieldset').attr('id').replace('-check','');
        if (this.className == 'price') {
            var priceClass = $(obj).attr('id'); 
            value = priceClass; 
        }
        if (obj.checked === true) { // add to array
            Filter.arrayOfValues.push(value);
        }
        else { // remove from array
            Filter.arrayOfValues = jQuery.grep(Filter.arrayOfValues, function(val) {
                return val != value;
            });
        }
    },
    
    showProducts: function() {
        Filter.findCommonElements();
        var prodCount = Filter.final.length;
        if (prodCount > 0) {
            for (var i=0; i<prodCount; i++) {
                $('#'+Filter.final[i]).fadeIn('slow').addClass('visible');
            }
        } else { // if none of the products meet the conditions, display message
            $('#noprodsmsg').show();
        }
    },
    
    setFilterCookie: function() {
        var href = window.location.href.slice(window.location.href.lastIndexOf('/')+1, window.location.href.lastIndexOf('.'));
        var cookieValues = '';
        var cookieProds = '';
        for(var ab in Filter.products) {
            cookieProds += '|'+ab+':'+Filter.products[ab];
        }
        cookieProds = cookieProds.slice(1);
        for (var i=0; i<Filter.arrayOfValues.length; i++) {
            cookieValues += '|'+Filter.arrayOfValues[i];
        }
        cookieValues = cookieValues.slice(1);
        $.cookies.set('filters['+href+'][prods]', cookieProds);
        $.cookies.set('filters['+href+'][values]', cookieValues);
    },
    
    getFilterCookie: function() {
        var href = window.location.href.slice(window.location.href.lastIndexOf('/')+1, window.location.href.lastIndexOf('.'));
        var cookieProds = $.cookies.get('filters['+href+'][prods]');
        var cookieValues = $.cookies.get('filters['+href+'][values]');
        if (cookieProds && cookieValues) {
            Filter.products = [];
            Filter.arrayOfValues = [];
            var tmpProds = cookieProds.split('|');
            var tmpValues = cookieValues.split('|');
            for (var i=0; i<tmpProds.length; i++) {
                var tmp1 = tmpProds[i].split(':');
                Filter.filters.push(tmp1[0]);
                Filter.products[tmp1[0]] = [];
                var tmp2 = tmp1[1].split(',');
                for (var j=0; j<tmp2.length; j++) {
                    if (tmp2[j] != '')
                    Filter.products[tmp1[0]].push(tmp2[j]);
                }
            }
            for (var i=0; i<tmpValues.length; i++) {
                if (/^filterPrice/.test(tmpValues[i])) { // if price, search not in value but in ID
                    $('#filterform input#'+tmpValues[i]).attr('checked', 'checked');
                } else {
                    $('#filterform input[value="'+tmpValues[i]+'"]').attr('checked', 'checked');
                }
                Filter.arrayOfValues.push(tmpValues[i]);
            }
            Filter.filters = Filter.unique(Filter.filters);
            $('li', Filter.prodWrap).hide().removeClass('visible');
            Filter.showProducts();
        }
    },

    startFilter: function() {
        $('#filterform .clear').click(function() {
            $(this).parent().find('input:checkbox').removeAttr('checked');
            Filter.className = $(this).parents('fieldset').attr('id').replace('-check','');
            Filter.arrayOfValues = [];
            Filter.products[Filter.className] = [];
            $('#filterform input:checked').each(function() {
                Filter.setArrayOfValues(this);
            })
            Filter.showProducts();
            Filter.setFilterCookie();
        });

        $('#filterform input:checkbox').click(function() {
            $('li', Filter.prodWrap).hide().removeClass('visible');
            $('#noprodsmsg').hide();
            
            Filter.setArrayOfValues(this);
            
            Filter.products[Filter.className] = [];
            
            $('.parameters span', Filter.prodWrap).each(function() {
                var producer = $(this).text();
                var id = $(this).parent().parent().attr('id');
                // if price
                if (Filter.className == 'price') {
                    producer = $(this).siblings('.priceRange').text();
                }
                if (Filter.in_array(producer, Filter.arrayOfValues)) {
                    if ($(this).hasClass(Filter.className)) { 
                        Filter.products[Filter.className].push(id);
                        Filter.products[Filter.className] = Filter.unique(Filter.products[Filter.className]);
                    }
                }
            });
            
            Filter.showProducts();
            Filter.setFilterCookie();
            
            if (!Filter.arrayOfValues.length) {
                // if no checkbox is check, display all products
                $('li', Filter.prodWrap).fadeIn('slow').addClass('visible');
            }
            filterKind();
        });
    },
    
    findCommonElements: function() {
        this.final = [];
        var tab = this.products;
        var filters = this.filters;
        var filtersLength = filters.length;
        var c = [];
        var d = [];
        var tabLength = tab.length;
        
        for (var i=0; i<filtersLength; i++) {
            c.push(tab[filters[i]]);
        }
        $('li', Filter.prodWrap).each(function() {
            var id= $(this).attr('id');
            var yes = 1;
            for (var i=0; i<c.length; i++) {
                if (c[i].length) {
                    if (c[i].indexOf(id)==-1) {
                        yes = 0;
                    }
                }
            }
            if (yes == 1) {
                Filter.final.push(id);
            }
        });
    } 
};

function filterKind() { 
	// generate filter buttons
	if ($(Filter.prodWrap).length) {
	   $('#prodkindlist li:not(:first)').remove();
        var stringOfSpanValues = '';
        $('li.visible .filters span', Filter.prodWrap).each(function() {
            stringOfSpanValues += $(this).text() + ', ';
        });
        //stringOfClassNames = jQuery.trim(stringOfClassNames);
        var arrayClasses = stringOfSpanValues.split(', ');
        arrayClasses.pop();
        var arrayUniqueClasses = Filter.unique(arrayClasses);
        if (arrayUniqueClasses.length) {
            // then build the buttons with Span names
            $.each(arrayUniqueClasses, function() {
                //var cl = this.split(' - ');
                $('<li>' + this + '</li>').appendTo('#prodkindlist');
            });
        }
    }    
	// filter products
	$('#prodkindlist li').click(function() {
		$('#prodkindlist .active').removeClass('active');
		$(this).addClass('active');
		
		var filterVal = $(this).text();
		if (filterVal == 'Wszystkie') {
			$('li.visible', Filter.prodWrap).fadeIn('slow');
		} else { 
			$('li.visible .filters', Filter.prodWrap).each(function() {
				if ($(this).find('span').length) {  
					var jest = 'no';
					$(this).find('span').each(function() { 
						if ($(this).text() == filterVal) { 
							jest = 'yes';
						}
					});
					if (jest == 'yes') {
						$(this).parent().fadeIn('normal');
					} else {
						$(this).parent().fadeOut('slow'); 
					}
				} else {
					$(this).parent().fadeOut('normal');  
				}
			});
		}
		return false;
	});
}

function changeProductView() {
    var gFilter = 'view01';
	$('#viewkind li a').click(function() {
	    $(Filter.prodWrap).removeClass(gFilter);
		$('li.visible', Filter.prodWrap).hide();
		var filter = gFilter = $(this).attr('class');
		$(Filter.prodWrap).addClass(filter);
		$('li.visible', Filter.prodWrap).fadeIn('slow');
		$('li', Filter.prodWrap).css({'height':''})
		$('li', Filter.prodWrap+'.view01').setEqualHeight();
		
		return false;
	});
}


